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

时间:2013-05-18 02:02:47

标签: c# entity-framework-5

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

1 个答案:

答案 0 :(得分:8)

  

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

您实质上是在谈论您将在EF中使用哪种继承模式;或模型如何映射到数据库表。 EF中有3种主要的继承模式(参见Inheritance Mapping: A Walkthrough Guide for Beginners):

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

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

  

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

EF有4种,只有4种发展策略(见Entity Framework Development Workflows):

  

我不想丢弃数据库并重新创建它,特别是在我开始填充数据库之后

Code First非常非常擅长:

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

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

选择模式和策略

每种策略都有优点和缺点,每种继承模式都可以更好地用于特定的开发策略。权衡取决于您自己的判断,例如,如果您拥有继承的现有数据库,您可能 使用数据库优先,或者您可能更乐意使用EF设计器,因此可以使用模型 - 第一。

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

  

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

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

您的最佳方法

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

  1. 您想要TPH或TPC(或混合策略)
  2. 您不希望在发布模型更新时删除数据库
  3. 然后,这些技术要求的最佳匹配是Code First开发,包括迁移和播种。

    Code First的缺点是必须编写自己的POCO,并学习data annotation attributes。但是,请记住:

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