我打算在我的下一个项目中使用Entity Framework 4.1,但是我找不到一个很好的方法来解决它。 简而言之,我想构建一个多层应用程序,其中实体将通过Web服务传播,并尽可能保持干净,我想使用POCO而不是自我跟踪实体。此外,已存在将用于基于实体的SQL 2008数据库。
从我到目前为止所读到的内容(来自Julie Lerman关于http://msdn.microsoft.com/nl-nl/magazine/hh148150%28en-us%29.aspx的文章等),似乎:
我意识到“DbModelBuilder-way”需要付出这么多努力的原因是因为它被设计为反过来使用:你应该从实体定义生成数据库,而不是试图调整所有实体,以便它们(希望)与现有数据库匹配。然而,在我看来,“DbModelBuilder-way”最终会产生最好的结果:纯POCO,其中没有数据库元数据。
现在,说完这一切,我的问题是:
是否有人知道将.edmx加载到DbModelBuilder 的方法,以便不需要通过流畅的API手动指定外键,列映射和其他信息?
我认为这将是两个世界中最好的,因为您可以像在Database First场景中那样直观地编辑映射,并且仍然可以获得干净的POCO,因为所有必需的元数据都存储在DbModelBuilder中。
答案 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="Data Source=.;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
DbContext将填充.edmx中的所有元数据(列映射,外键关系等)。此外,不执行DbContext的OnModelCreating。这是使用POCO的数据库优先,这就是我想要实现的目标。
我做错了是我使用常规 SQL 连接字符串传递给DbContext。这会导致完全不同类型的行为:因为DbContext现在为空,它将尝试探索所有Entity类并使用约定为此生成数据库模式。现在调用OnModelCreating,期望你调整这个映射,然后从中生成一个数据库。
简而言之,解决方案是使用实体连接字符串而不是SQL连接字符串。
答案 2 :(得分:0)
了解T4 POCO生成模板:
这些T4代码生成模板允许您使用
这为您提供了两全其美 - 一个不错的EDMX模型和持久性无知的POCO课程。