我计划在我的下一个项目中使用 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 中。