2011-09-28 52 views
2

我是新来的实体框架4.1,我真的想过渡到我的模型的POCO类。我发现使用安装EF 4.1时提供的“DbContext Generator”项很容易。它完成了我想要的工作,并为我现有的EDMX模型生成了DbContext对象和所有POCO。实体框架4.1 DbContext生成器问题

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

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

我有四个相关的问题:

  1. 为什么我必须保持EDMX在我的项目?
  2. 有没有解决方法?
  3. 当你用EF 4.1做真正的“代码优先”时会发生什么,它从哪里获得这些元数据文件?
  4. 无论如何这些元数据文件是什么?

回答

3

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

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

+1

电动工具真棒!这是代码优先的真正的逆向工程。不知道我是如何在追捕中错过的。感谢Mystere Man! – Chev

0

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

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

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

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

2
  1. 的EDMX文件负责在编译时在装配嵌入CSDL,SSDL,& MSL元数据资源。

  2. 是的。您将需要实体框架电动工具CTP 1.请参阅Mystere Man对此问题的答案以获取链接。这将是从现有数据库到代码优先的真正转换。这意味着你的代码将推动模式前进,而不是相反。

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

    DbContext API的这个缺点绝对是最大的问题,目前正在由ADO.NET团队开展工作,如Scott Hansleman's blog post所述。

    现在我已经亲自选择手动修改数据库,然后更新我的C#代码以反映它。这需要一些关于这些东西如何工作的体面知识,我仍在练习。另一种方法是将EDMX文件保留在那里,像通常那样更新它,并在事情发生变化时让它重新生成POCO。然而,这与经典的EF更新几乎没有区别,因为对POCO的任何更改在重新生成时都会被覆盖。

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

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

    这可以防止EDMX运行你的T4模板和再生你波苏斯。因此,您只需更新它以确保元数据资源保持准确。但是,您将手动修改您的POCO以反映对模型/模式的任何更改。这仍然需要更多的工作,而不仅仅是让它生成你的代码,但这对我的愚见来说是有益的。

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