从LINQ迁移到SQL到Entity Framework 4.0 - 提示,文档等

pba*_*nis 17 entity-framework .net-4.0 linq-to-sql entity-framework-4

我在.NET 3.5 SP1中尝试了EF,我是众多感到沮丧的人之一,并决定学习LINQ to SQL.现在我知道EF是"选择"的前进路径,加上EF 4.0有一些令人兴奋的新功能,我想将我的应用程序迁移到EF 4.0.

任何人都可以建议任何专门针对4.0 L2S迁移的良好资源吗?注意:我可以在.NET 3.5上找到大量与从L2S迁移到EF相关的博客和文章,但我觉得其中很多很明显过时并且对使用4.0的人没有帮助.

我真的很喜欢我能得到的那么深的,引擎盖下的东西; 我想真的离开,感觉我知道 EF 4.0我目前知道L2S 3.5的方式.

TIA!

fdf*_*rye 22

我已经完成了这种非常类型的转换和FWIW,我想说有更多相似之处而不是差异.我不认为有任何明确的文档可以让你觉得自己是EF4的专家,除了那些已经存在的东西......

http://msdn.microsoft.com/en-us/library/ex6y04yf(VS.100).aspx

我能给你的是更明显的"陷阱".具体来说,Linq2Sql希望将业务层和数据层更加明显地结合起来.它真的推动你创建自己的部分类.我可以继续前进,但最具体的原因是一对一映射器将为所有关系创建公共父和子属性的方式.

如果您尝试对此模型使用任何类型的序列化,您将会遇到循环引用问题,因为序列化程序从父级移动到子级,然后返回到父级,因为Linq2Sql序列化行为自动包括图中的所有子级.当您尝试获取客户记录以检查"名称"属性并自动获取图表中包含的所有相关订单记录时,这也会非常烦人.您可以将这些父和子导航属性设置为"公共"或"内部",这意味着如果您想要访问它们,但不希望序列化程序自动创建循环引用,您几乎必须以部分方式访问它们类.

一旦开始部分类路径,通常只需继续该模式,最终将开始添加辅助方法,以便将数据访问到各个实体类中.此外,由于Linq2Sql DataContext更轻量级,您经常会发现人们使用某种Singleton模式或Repository模式作为其上下文.使用EF 3.5/4时,您看不到这一点.

因此,假设您有一些类似于所描述的环境,并且您想要开始转换.好吧,你需要找出你的DataContext将被创建/销毁的时间......有些人只会使用using()语句启动每个Business Layer方法,并让上下文在该方法的生命周期中生效.显然这意味着你可以进入一些毛茸茸的情况,需要在你的问题的末尾添加.ToList()或其他一些扩展方法,你可以有一个完全内存的对象集合传递给子方法或任何甚至甚至然后,您可能会遇到尝试更新最初未检索到的上下文中的实体的问题.

如果没有明确处理数据操作,您还需要弄清楚如何将Linq2Sql部分类中包含的大部分BusinessLogic放到另一个层中.当您需要/不需要您的背景时,这不会是无痛的,但它是最好的..

接下来,您将要处理对象图的情况.由于延迟加载的工作方式不同(他们在EF 4.0中进行了配置,使其对于想要它的人更像Linq2Sql),您可能需要检查来自Linq2Sql的图中子对象的任何隐含用法实现并验证它现在不需要显式的.Include()或.Load()来获取图中的子对象.

最后,您需要确定一般的序列化解决方案.默认情况下,作为EF模型的一部分生成的DataContracts和DataMember属性可以很好地与WCF一起使用,但是对于像旧的.asmx WebServices这样的东西使用的XmlSerializer并不是很好.即使在这种情况下,如果您不需要通过线路序列化子对象,也可以使用它.由于通常情况并非如此,如果您有更多的SOA,那么您将希望转移到WCF,这将增加一系列新的机会,但令人头疼.

为了应对部分类情况,以及沉重的DataContext甚至是序列化问题,有许多可用的EF 4.0新代码生成模板.在POCO实体模板有很多人兴奋,因为它创建POCO类,正如你所期望的(麻烦的是,排除了任何类或WCF等等等等成员属性).此外,自我跟踪实体模型几乎解决了上下文问题,因为您可以传递您的实体并让它们记住它们何时以及如何更新,因此您可以更自由地创建/处置您的上下文(如Linq2Sql).作为另一个奖励,此模板是WCF的首选模板或基于WCF的任何内容,如RIA服务或WCF数据服务,因此它们已经找到了[DataContract],[DataMember]和[KnownType]属性.

这是POCO模板的链接(不包括开箱即用):(编辑:我不能发布两个超链接,所以只需访问visualstudio库网站并搜索"ADO.NET C#POCO实体生成器")

请务必阅读ADO.net团队博客中有关实施此链接的链接.如果您属于WebService与WCF服务类别,您可能会喜欢将上下文和实体拆分为单独的项目/程序集."添加服务引用..."代理生成不会像以前使用"添加Web引用..."那样执行命名空间,因此您可能希望在客户端应用程序中实际引用实体类程序集,以便"排除"从参考图书馆类型"或任何您的服务引用这样你就不会得到很多从使用相同的EF模型,并揭露那些实体的多种服务的不明确引用的...

我知道这是漫长而漫无边际的,但这些小问题对我来说更像是一个问题,而不是记住使用context.EntityCollection.AddObject()而不是context.EntityCollection.InsertOnSubmit()和context.SaveChanges()而不是上下文.的SubmitChanges()...