实体框架4.1 DbContext生成器问题

时间:2011-09-28 05:11:19

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

我是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. 那些元数据文件是什么?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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,这些资源都存在,只是它们的生成方式不同。

答案 2 :(得分:0)

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

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

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

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