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

标签 c# entity-framework-5

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

最佳答案

I want the various objects to inherit from an object called Device since they will all have some properties in common (i.e. IP Address, MAC Address, etc.)

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

  • 每个层次结构一个表
  • 每个类型一个表
  • 每个具体类型的表格

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

I like to create the objects using the designer (Model First) but I do not like the difficulty in updating the database from the model.

EF 有 4 种且只有 4 种开发策略(参见 Entity Framework Development Workflows ):

I do not like to have to drop the database and recreate it, especially once I start populating the database

Code First 在这方面真的非常非常擅长:

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

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

选择模式和策略

每种策略都有利弊,每种继承模式更适合特定的开发策略。权衡实际上由您自己判断,例如,如果您继承了现有数据库,您可能必须使用数据库优先,或者您可能更愿意使用 EF 设计器,因此会使用模型-第一的。

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

when I create the POCOs from the database the entities do not inherit from each other

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

您的最佳方法

不幸的是,这取决于意见。但是,如果您的主要要求是:

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

那么最符合这些技术要求的是 Code First 开发,包括迁移和播种。

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

  • 编写 POCO 与编写数据库表并没有太大区别(一旦您习惯了,它就一样快)
  • Code First 更适用于自动化测试(例如,使用 DI 和/或 IoC 进行测试而不涉及数据库),因此以后可以受益
  • 如果您打算首先对数据库进行大量 EDMX 操作,或者每当您首先使用模型删除和更新数据库时进行大量工作,那么您只是在其他地方投入时间和精力,而不是在写作上POCO

关于c# - 我应该在 Entity Framework 中使用继承还是有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620010/

相关文章:

C# 第二维数组到一维数组的引用

entity-framework - EF Code First、IoC 和 DbConnection

c# - 查询 SQL Server 的百分比

c# - 有界 DbContex 和继承

c# - MVC Controller VS 工厂方法

c# - 调用远程dll

c# - 作为 C# 类的 javascript Highcharts 对象

c# - Console.SetOut 到 StreamWriter,不断写入文本文件

c# - 在 Entity Framework 5 Code First 中覆盖 SaveChanges 以复制旧遗留库的行为

c# - 引用外部类型枚举和包含方法