我应该在Entity Framework中使用继承还是有更好的方法?

Bil*_*eer 8 c# entity-framework-5

我想在应用程序中跟踪各种对象.对象是计算机,照相机,交换机,路由器等.我希望各种对象从一个名为Device的对象继承,因为它们都有一些共同的属性(即IP地址,MAC地址等)我喜欢创建对象使用设计器(Model First),但我不喜欢从模型更新数据库的困难.基本上,我不喜欢删除数据库并重新创建它,特别是在我开始填充数据库之后.我尝试的另一种方法是在SQL Server中使用SSMS创建数据库,但是当我从数据库创建POCO时,实体不会相互继承.对我的情况有什么好处?

And*_*own 11

我希望各种对象从一个名为Device的对象继承,因为它们都有一些共同的属性(即IP地址,MAC地址等)

您基本上是在讨论要在EF中使用哪种继承模式; 或模型如何映射到数据库表.EF中有3种主要类型的继承模式(请参阅继承映射:初学者演练指南):

  • 表每层次
  • 表每类型
  • 每表混凝土类型

每个都有利弊(如表现).但是,您还应该考虑此模型是与数据库相关的模型,然后在较大的项目中,您可以创建第二层以用于业务逻辑.DDD讨论了持久性模型和领域模型.同样,您在此处的选择正在权衡开发的初始速度以及稍后的可扩展性和性能.

我喜欢使用设计器(Model First)创建对象,但我不喜欢从模型更新数据库的困难.

EF有4种且只有4种开发策略(参见实体框架开发工作流程):

我不喜欢删除数据库并重新创建它,特别是在我开始填充数据库之后

Code First非常非常擅长:

  • Code First中的种子允许您使用测试或实时数据填充数据库,具体取决于您部署到的位置.
  • 迁移允许您对数据库进行非破坏性更新,并以完全可测试的,完全可靠的方式迁移数据以进行实时部署.

不幸的是,使用Model First执行此操作会更加困难.我所知道的唯一真正的解决方案是生成一个新数据库,并使用SQL比较(带数据比较)工具在新数据库中生成数据.

选择模式和策略

每种策略都有利有弊,每种继承模式都可以更好地用于特定的开发策略.权衡取舍实际上是您自己的判断,例如,如果您拥有继承的现有数据库,则可能必须首先使用数据库,或者您可能更乐意使用EF设计器,因此将使用模型优先.

Model First(我的意思是使用EF设计器来定义您的模型)默认使用TPT策略.请参阅EF Designer TPT继承.如果你想要TPH,那么你可以使用Model-first(参见EF Designer TPH继承),但你还有额外的工作要做; Code First更适合TPH.TPC使用Model First更加困难,而Code First在EF 5中确实是最好的(唯一可行的)选择.

当我从数据库创建POCO时,实体不会相互继承

记住模型处理类是很好的; 数据库处理表中的存储.从数据库生成模型时,EF很难确定TPH或TPC继承应该是什么.它所能做的就是根据表格关联在你的模型上创建一个"最佳猜测".在通过重命名属性,更改关联或应用继承来生成模型之后,您必须帮助它.真的没有其他方法可以做到这一点.因此,对数据库的更新也可能需要对模型进行更多的工作.

你最好的方法

不幸的是,这归结为意见.但是,如果您的主要要求是:

  1. 你想要TPH或TPC(或混合策略)
  2. 发布模型更新时,不希望删除数据库

那么这些技术要求的最佳匹配是Code First开发,具有迁移和播种.

Code First的缺点是必须编写自己的POCO,并学习数据注释属性.但是,请记住:

  • 编写POCO与编写数据库表并没有太大的不同(一旦你习惯它就像它一样快)
  • Code First在自动化测试中更加实用(例如,在没有涉及数据库的情况下使用DI和/或IoC进行测试),因此可以在以后获得好处
  • 如果您要先使用数据库进行大量EDMX操作,或者在使用模型首先删除和更新数据库时进行大量工作,那么您只需在其他地方投入时间和精力而不是编写POCO