嗯,我刚刚在 EF 中实现了一个完整的系统,这是我在生产环境中第一次真正体验 EF。该应用程序现在运行了大约 45 天,每天有 100 名用户使用它,没有任何问题。
我认为最大的事情是你必须改变你的想法。如果您像关系数据库 ORM 一样思考,那么您已经有了错误的心态。您需要考虑部分方法、对象和扩展。一旦你掌握了基本的心态,事情就会开始流动(并且你从一开始就重写了很多代码)。
很难获得帮助
EF 的另一个令人沮丧的部分是,无论你去哪里寻求帮助,到处都是 L2S 大佬,他们认为他们已经知道你需要做的所有事情,并一直试图告诉你放弃它,只使用 L2S...如果我愿意已经询问了如何在 L2S 中做到这一点,那么他们的意见可能是有效的......
EF 工作正常
生成可以通过部分方法扩展的对象的基本功能运行良好。实际上,我在早期阶段非常沮丧,因为我一直在尝试以 SQLCommand 中的方式获取内容。一旦您意识到您可以根据业务逻辑的需求而不是 SQL 的工作方式进行思考,您就可以完成更多工作。
例如 - 我一直在尝试进行连接以获取与特定 FK 相关的各种任务的列表。一旦我最终发现我可以将整个 where 子句交给 EF 并弄清楚如何快速将数据返回给我,代码实际上要快得多。
包括臭味
不过,Include 语法对我来说就像是一个 hack。必须使用 .Include("TableName.DetailTable") 是丑陋的。也许我只是被智能感知宠坏了,但我讨厌那种语法。
按需加载
主细节加载也有点难看。如果您不想包含它们,您可以随时参考它们并查看它是否为 .IsLoaded,然后调用 .Load。为什么?对象不能为我做那件事吗?我最终在我的对象上实现了一个扩展方法,如果我尝试加载一个未加载的细节类,它会按需加载它。似乎应该内置在我身上。
注意:上面提到的过滤记录集的详细加载并不复杂,但也不明显。您可以使用 Lambda 表达式进行过滤。
您是否曾经想要移动项目?
这是一个重要原因:非供应商锁定。如果您曾经想将该代码带到另一个数据库,那么您无法使用 Linq2SQL 执行此操作。没有提供者模型。您可能有机会将 EF 系统转移到另一个供应商。在我的情况下,相同的项目在 SQL Server 和 VistaDB EF (Alpha) 上运行,无需更改代码。所以我可以 xcopy 部署它,或者在运行时选择连接到服务器。