我想在应用程序中跟踪各种对象。对象是计算机、相机、交换机、路由器等。我希望各种对象继承自一个名为 Device 的对象,因为它们都有一些共同的属性(即 IP 地址、MAC 地址等)。我喜欢创建对象使用设计器(模型优先),但我不喜欢从模型更新数据库的困难。基本上,我不喜欢必须删除数据库并重新创建它,尤其是在我开始填充数据库时。我尝试的另一种方法是在 SQL Server 中使用 SSMS 创建数据库,但是当我从数据库创建 POCO 时,实体不会相互继承。什么是适合我的情况的好方法?
1 回答
我希望各种对象从一个名为 Device 的对象继承,因为它们都有一些共同的属性(即 IP 地址、MAC 地址等)
您本质上是在谈论您将在 EF 中使用哪种继承模式;或者模型如何映射到您的数据库表。EF 中有 3 种主要类型的继承模式(请参阅继承映射:初学者演练指南):
- 每层级表
- 每个类型的表
- 每混凝土表类型
每个都有优点和缺点(例如性能)。但是,您还应该考虑到此模型是与数据库相关的模型,并且在较大的项目中,您可能会创建第二层来处理业务逻辑。DDD 谈论持久性模型和域模型。同样,您在这里的选择是在权衡开发的初始速度以及以后的可扩展性和性能。
我喜欢使用设计器(模型优先)创建对象,但我不喜欢从模型更新数据库的困难。
EF 有 4 种,也只有 4 种开发策略(请参阅实体框架开发工作流程):
我不喜欢删除数据库并重新创建它,尤其是当我开始填充数据库时
Code First 真的非常非常擅长:
- Code First 中的种子允许您根据部署到的位置使用测试或实时数据填充数据库。
- 迁移允许您对数据库进行非破坏性更新,并以完全可测试、完全可靠的方式迁移数据以进行实时部署。
不幸的是,使用 Model First 执行此操作更加困难。我所知道的唯一真正的解决方案是生成一个新数据库,并使用 SQL compare(与数据比较)工具在新数据库中生成数据。
选择模式和策略
每种策略都有优点和缺点,每种继承模式都更好地与特定的开发策略一起使用。权衡确实是您自己来判断的,例如,如果您继承了现有的数据库,您可能必须使用数据库优先,或者您可能更乐意使用 EF 设计器,因此会使用模型优先。
模型优先(我的意思是使用 EF 设计器来定义您的模型)默认使用 TPT 策略。请参阅EF 设计器 TPT 继承。如果你想要 TPH,那么你可以使用模型优先(参见EF Designer TPH Inheritance),但是你还有额外的工作要做;Code First 更适合 TPH。TPC 使用 Model First 更加困难,而 Code First 确实是 EF 5 中最好的(唯一可行的)选项。
当我从数据库创建 POCO 时,实体不会相互继承
记住模型处理类是很好的。数据库处理表中的存储。从数据库生成模型时,EF 很难确定 TPH 或 TPC 继承应该是什么。它所能做的就是根据表关联在您的模型中创建一个“最佳猜测”。在生成模型后,您必须通过重命名属性、更改关联或应用继承来帮助它。真的没有其他方法可以做到这一点。因此,对数据库的更新也可能需要对模型进行更多的工作。
你最好的方法
不幸的是,这取决于意见。但是,如果您的主要要求是:
- 您想要 TPH 或 TPC(或混合策略)
- 当您发布模型更新时,您不想删除数据库
那么最符合这些技术要求的就是 Code First 开发,包括迁移和播种。
Code First 的缺点是必须编写自己的 POCO,并学习数据注释属性。但是,请记住:
- 编写 POCO 与编写数据库表没有太大区别(一旦你习惯了,它也一样快)
- Code First 更适用于自动化测试(例如,使用 DI 和/或 IoC 在不涉及数据库的情况下进行测试),因此以后可以从中受益
- 如果您要首先对数据库进行大量 EDMX 操作,或者每当您首先使用模型删除和更新数据库时进行大量工作,那么您只是在其他地方投入时间和精力,而不是编写 POCO