【问题标题】:Linq-to-SQL Design question!Linq-to-SQL 设计问题!
【发布时间】:2010-01-11 23:26:44
【问题描述】:

如果您需要从 dbml 文件创建 POCO 对象怎么办?你使用发电机和谁?您手动编写 POCO? 假设你想让你的对象 Persistent Ignorant 并共享给客户端,然后为 Client - DAO - L2S 对象之间的通信创建一个 DAO 模式,这是使用 Linq 2 SQL 进行断开连接设计的问题。假设使用客户端的 POCO 应该尽可能原始,没有依赖项(EntityRef、EntitySet、属性等),当然您可以使用适当的 DATA 将 L2S 对象转换为 POCO。 对这个概念的任何帮助和任何更正都会非常有帮助!

【问题讨论】:

    标签: linq-to-sql design-patterns architecture c#-3.0


    【解决方案1】:

    我很想说“等到 .NET 4.0 中的 EF”,它已经大大改进了 POCO 支持(与当前的 EF 相比),并希望在 VS2010 中提供 POCO T4 模板。

    目前 SqlMetal 会发出丰富的对象;虽然 LINQ-to-SQL 可以处理 POCO 类型,但您必须自己编写 POCO,或者在 dbml 上使用 xslt / T4 / 任何东西。

    【讨论】:

    • OP是指L2S还是EF?
    • 澄清;很抱歉模棱两可;我的主要观点是 EF 4.0 代码生成具有 POCO 功能
    • 是的,我听说过 EF 4 和 T4 代码生成,你的意思是我们可以创建代码(像 POCO 一样简单的类),用于整个上下文域模型? Danniel Simmons 在采访中谈到 codegen 很糟糕,而 T4 是 EF 4 的方式。但我现在使用 L2S,等不及了 :( 我想写 POCO 是我现在的一种方式!
    【解决方案2】:

    SqlMetal 可以通过/map[:file] 开关从输入 DBML 文件发出 XML 映射文件。这会从生成的类文件中删除属性,这更接近 POCO - 您只需要记住从 XML 映射文件初始化数据上下文实例。

    删除 EntitySet<T>EntityRef<T> 引用比较困难,我不确定我是否会推荐这样做,因为您会失去很多有用的功能。但是,有可能 - 您需要通过删除所有 <Association> 元素来手动操作传递给 SqlMetal 的 DBML 文件。例如,您可以使用 LINQ to XML 作为构建过程中的自定义步骤来执行此操作。

    这基本上会禁用输出映射文件和类中的关联,因为 SqlMetal 只会为 <Association> 映射生成 EntitySet / EntityRef 代码。但是,您将失去自动管理父子关系的能力。

    这会给你一个非常接近的 POCO 模式 - 你会得到的唯一其他东西是 INotifyPropertyChanging 实现,但我认为你可以证明坚持下去,因为它相当通用。

    如果这不能满足您的需求,那么您可以考虑自己生成代码 - 查看T4 templates for LINQ to SQL,它适用于 VS 2008 并且基于 SqlMetal,但您可以选择完全自定义输出以适应您的需求,因为它使用 T4 进行模板规范和输出生成。

    【讨论】:

      【解决方案3】:

      我们也使用 Linq2Sql,需要根据 L2S 结果编写自己的模型类。经过大量谷歌搜索后,我发现T4 POCO Templates for Linq2Sql and EF 使用 .dbml 或 .edmx 文件作为源并创建自己的 POCO 实体。 文章底部的下载链接或duplicated here。 我们将其用作基础,然后根据需要对其进行定制。

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多