【问题标题】:Entity Framework 4.1 DbContext generator problemsEntity Framework 4.1 DbContext 生成器问题
【发布时间】:2011-09-28 05:11:19
【问题描述】:

我是 Entity Framework 4.1 的新手,我真的很想为我的模型过渡到 POCO 类。我发现使用安装 EF 4.1 时提供的“DbContext Generator”项目非常容易。它完全按照我的意愿去做,并为我现有的 EDMX 模型生成了 DbContext 对象和所有 POCO。

我运行了该应用程序并测试它是否仍在运行。它是。对此我很满意,我删除了 EDMX 文件和 T4 模板,并开始重新组织我的新 POCO。但是,在让它再次正确构建后,我遇到了运行时问题。实例化 DbContext 时找不到元数据文件:.csdl、.ssdl 和 .msl(我真的不知道它们是什么,只是它们是所有 EF 连接字符串的一部分)。

放回我的 EDMX 后,它再次运行良好。我真的不再想要 EDMX 文件了。我真的很想坚持 POCO 课程并忘记 EDMX 曾经存在过;特别是因为我不希望它运行那些 T4 模板并重新生成我的 POCO。

我有四个相关的问题:

  1. 为什么我必须在我的项目中保留 edmx?
  2. 有解决办法吗?
  3. 当您使用 EF 4.1 执行真正的“代码优先”时会发生什么情况,它从哪里获取这些元数据文件?
  4. 这些元数据文件到底是什么?

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4.1 poco


    【解决方案1】:

    你应该read this。它描述了不同的项目类型。

    简短的回答是使用 dbcontext 生成器时需要 .edmx 文件。如果要使用 Code First,则必须手动描述模型或使用 Entity Framework 电动工具 CTP1 对 Code First 模型进行逆向工程。

    【讨论】:

    • 电动工具真棒!这是代码优先的真正逆向工程。不知道我是如何在狩猎中错过它的。谢谢神秘人!
    【解决方案2】:
    1. EDMX 文件负责在编译时将 CSDL、SSDL 和 MSL 元数据资源嵌入到程序集中。

    2. 是的。您将需要 Entity Framework Power Tools CTP 1。有关链接,请参阅 Mystere Man 对此问题的回答。这将是从现有数据库到代码优先的真正转换。这意味着您的代码将推动架构向前发展,而不是相反。

    3. 当您进行真正的代码优先开发时,CSDL、SSDL 和 MSL 元数据资源仍然存在。它们只是在您构建时从您的对象模型中推断出来的。因为代码控制模型和模式,所以它能够自行推断这些资源。在某些情况下,它不知道从代码中推断出什么。例如,如果您更改实体属性名称,它无法知道您是否打算删除旧列(属性名称)并添加具有新名称的新列,或者您是否打算保留旧列并重命名它用新名字。这就是为什么没有使用 EF 代码优先的良好数据/模式迁移的原因,以及为什么每次您在代码中更改模型时它都会删除并重新创建整个数据库。

      DbContext API 的这个缺点绝对是最大的问题,正如 Scott Hansleman's blog post 所指出的,ADO.NET 团队目前正在解决这个问题。

      目前我个人选择手动修改数据库,然后简单地更新我的 C# 代码以反映它。这需要对这些东西如何工作有一些体面的了解,我仍在练习。另一种方法是将 EDMX 文件保留在那里,像往常一样更新它,并让它在事情发生变化时重新生成你的 POCO。但是,这与执行经典 EF 更新几乎没有什么不同,因为对 POCO 的任何更改都将在重新生成时被覆盖。

      另一个解决方案是再次将 EDMX 文件保留在那里并在情况发生变化时对其进行更新,但将“保存时转换相关文本模板”属性设置为 false。

      http://www.codetunnel.com/content/images/TransformRelatedTextTemplatesOnSave.jpg

      这会阻止 EDMX 运行您的 T4 模板并重新生成您的 POCO。因此,您只需对其进行更新以确保元数据资源保持准确。但是随后您将手动修改您的 POCO 以反映对模型/模式的任何更改。这仍然需要更多的工作,而不仅仅是让它生成您的代码,但以我的拙见,这对学习很有帮助。

    4. CSDL、SSDL 和 MSL 是 EF 的元数据资源。它们帮助 EF 确定如何将结果集映射到您的对象模型,反之亦然。它是数据库模式和您的代码之间的桥梁。无论你以何种方式使用 EF,这些资源都存在,只是它们的生成方式不同。

    【讨论】:

      【解决方案3】:

      这样不行。如果您决定使用 DbContext 生成器,则表示您的映射将在 EDMX 文件中描述。在编译期间,EDMX 文件被分解为三个单独的文件,扩展名为 .ssdl、.csdl 和 .msl。这些元数据文件描述了您的数据库、实体以及从数据库到实体的映射。这些文件默认存储为已编译程序集中的资源,并从传递给DbContext 实例的连接字符串中引用。如果要使用生成器创建的DbContext,则必须将 EDMX 文件保留在项目中。它与 EFv1 和 EFv4 中使用的映射方法相同 = 它不是代码优先。

      代码优先意味着无需 EDMX 和 T4 模板来为您生成映射和代码。通常,代码优先意味着您在拥有任何数据库之前编写类,并且数据库是由 EF 创建的。许多人在现有数据库中使用这种方法并手动将他们的类映射到现有数据库,但这需要一些 EF 知识/经验(或者您可以在此处提出有针对性的问题,我们会为您提供帮助)。

      上下文需要元数据来执行映射和 SQL 命令生成。 EDMX 映射策略使用上述 XML 文件中定义的元数据。代码优先映射策略使用一些默认约定、fluent-API 或数据注释来从编译后的代码中获取元数据。

      有一个单独的项目允许从现有数据库生成代码优先映射 - 我在您的 previous question 中指出了该项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 2011-11-11
        • 1970-01-01
        • 2011-12-05
        • 2014-11-12
        相关资源
        最近更新 更多