3

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

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

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

我意识到“DbModelBuilder 方式”需要这么多努力的原因是因为它被设计为反过来使用:您应该从实体定义生成数据库,而不是尝试调整所有实体以便他们(希望)匹配一个已经存在的数据库。但是,在我看来,“DbModelBuilder 方式”最终会产生最好的结果:纯 POCO,其中没有数据库元数据。

现在,说了这么多,我的问题是:
有谁知道将 .edmx 加载到 DbModelBuilder 中的方法,这样就不需要通过 fluent API 手动指定外键、列映射和其他信息?

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

4

3 回答 3

1

伙计,你在说什么?

如果您使用 Database First 方法,您将获得一个漂亮的 .edmx 来编辑您的模型,但您最终会得到持久性感知对象而不是 POCO,这在我的情况下没有用。

那不是真的。EDMX 可以产生几乎所有代码优先可以产生的东西,甚至可以产生许多代码优先不能产生的东西。

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

那不是真的。正确设置 EDMX 后,它将准确创建您想要的实体。

有谁知道将 .edmx 加载到 DbModelBuilder 中的方法

这样就是 DbContext T4 生成器!

无论如何,您还可以检查另一种工具:EF Power Tools CTP1。该工具可以从现有数据库创建代码优先映射。

当然,每个工具都会创建与数据库 1:1 映射的模型。如果你想要更多,你必须手动修改模型或映射!

于 2011-07-13T19:52:01.610 回答
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 连接字符串。

于 2011-07-14T07:47:43.547 回答
0

阅读有关 T4 POCO 生成模板的信息:

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

  • 使用 EDMX 模型文件的数据库优先方法
  • 但是:生成没有从任何 EF 特定类继承的简单 POCO(普通旧 CLR 对象)——它们只是绝对普通的 CLR 类.....

这为您提供了两全其美 - 一个很好的 EDMX 模型持久性无知的 POCO 类。

于 2011-07-13T19:49:33.457 回答