将.edmx加载到DbModelBuilder中

时间:2011-07-13 19:05:00

标签: entity-framework ef-code-first poco edmx

我打算在我的下一个项目中使用Entity Framework 4.1,但是我找不到一个很好的方法来解决它。 简而言之,我想构建一个多层应用程序,其中实体将通过Web服务传播,并尽可能保持干净,我想使用POCO而不是自我跟踪实体。此外,已存在将用于基于实体的SQL 2008数据库。

从我到目前为止所读到的内容(来自Julie Lerman关于http://msdn.microsoft.com/nl-nl/magazine/hh148150%28en-us%29.aspx的文章等),似乎:

  • 如果您使用数据库优先方法,您将获得一个漂亮的.edmx来编辑您的模型,但您总是会得到持久性感知对象而不是POCO,这在我的情况下无用。
  • 如果您使用Code First方法,“ADO.NET DbContext生成器”仅部分帮助您:它确实从.edmx生成实体,但它不生成获取外键和基数正确所需的代码。这意味着代码不会开箱即用( - 编辑,不是真的,请参阅下面的帖子 - ),你要么必须
    • a)在你的POCO上使用数据注释,这是非常丑陋的因为它用数据库信息污染了POCO,并且还创建了对EntityFramework程序集的依赖。
    • b)使用传递给DbContext.OnModelCreating的DbModelBuilder来设置正确的外键,映射等信息(即'fluent'API)。即使API可能“流畅”,但仍然很难(并且可能无法维护)正确设置所有这些信息以使其与现有数据库匹配(有关此示例,请参阅http://sessionfactory.blogspot.com/2011/04/conventions-in-entity-framework-41.html)。

我意识到“DbModelBuilder-way”需要付出这么多努力的原因是因为它被设计为反过来使用:你应该从实体定义生成数据库,而不是试图调整所有实体,以便它们(希望)与现有数据库匹配。然而,在我看来,“DbModelBuilder-way”最终会产生最好的结果:纯POCO,其中没有数据库元数据。

现在,说完这一切,我的问题是:
是否有人知道将.edmx加载到DbModelBuilder 的方法,以便不需要通过流畅的API手动指定外键,列映射和其他信息?

我认为这将是两个世界中最好的,因为您可以像在Database First场景中那样直观地编辑映射,并且仍然可以获得干净的POCO,因为所有必需的元数据都存储在DbModelBuilder中。

3 个答案:

答案 0 :(得分:1)

男人你在说什么?

  

如果您使用数据库优先方法,您将获得一个漂亮的.edmx   编辑你的模型,但你总是会有持久性意识   对象而不是POCO,这在我的情况下没用。

事实并非如此。 EDMX几乎可以生成所有代码,甚至可以生成许多代码最先不能的代码。

  

如果使用Code First方法,则使用“ADO.NET DbContext生成器”   只是部分帮助你:它确实从.edmx生成实体,   但它不会生成获取外键所需的代码   基数正确。这意味着代码不起作用   开箱即用,......

事实并非如此。正确设置EDMX后,它将创建您想要的实体。

  

有没有人知道将.edmx加载到DbModelBuilder

的方法

那是DbContext T4生成器!

无论如何,您还可以检查一个工具:EF Power Tools CTP1。此工具可以创建代码,从现有数据库开始映射。

当然,每个工具都会创建1:1映射到数据库的模型。如果您还需要更多功能,则必须手动修改模型或映射!

答案 1 :(得分:1)

显然,有两种方法可以使用“ADO.NET DbContext Generator”中生成的代码,具体取决于您使用的连接字符串类型。

如果您使用实体连接字符串,即:

<connectionStrings>
  <add name="MyDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

DbContext将填充.edmx中的所有元数据(列映射,外键关系等)。此外,不执行DbContext的OnModelCreating。这是使用POCO的数据库优先,这就是我想要实现的目标。

我做错了是我使用常规 SQL 连接字符串传递给DbContext。这会导致完全不同类型的行为:因为DbContext现在为空,它将尝试探索所有Entity类并使用约定为此生成数据库模式。现在调用OnModelCreating,期望你调整这个映射,然后从中生成一个数据库。

简而言之,解决方案是使用实体连接字符串而不是SQL连接字符串。

答案 2 :(得分:0)

了解T4 POCO生成模板:

这些T4代码生成模板允许您使用

  • 使用EDMX模型文件的数据库优先方法
  • 但是:生成简单的POCO(普通旧CLR对象),这些对象具有来自任何EF特定类的无继承 - 它们只是普通的CLR类......

这为您提供了两全其美 - 一个不错的EDMX模型持久性无知的POCO课程。