我正在尝试用Web API项目中的Entity Framework实现替换现有的数据库访问层。我已经有一些包含所需逻辑和属性的域类,例如Airport1,但实体框架生成了重复的对象,例如Airport2。我是否需要将Airport1合并到EF创建的Airport2对象中?或者只是将我的Airport1类改为部分类??
答案 0 :(得分:0)
EF的一个强大功能,有时也就是缺陷,它的目的是保持数据库/模型关系的一半与另一半保持同步,这样你就不必这样做了。这有两个基本模型;数据库优先和代码优先。在数据库优先中,EF检查预先存在的数据库模式并生成与其引用匹配的域模型。在代码优先中,EF会检查您的域并生成“迁移”,以生成和更新数据库架构。
你似乎想要做的是结合这些方法;为大多数对象生成一个类,但使用您自己的“Airport”对象定义覆盖生成的模型。不幸的是,没有一种非常方便的方法可以做到这一点,这对我们来说是安全的工作。
您的选择是:
放弃现有模型并使用“数据库优先”范例生成新模型。您将丢失现有域中的任何自定义业务逻辑,这些逻辑不是维护基本数据库完整性所固有的;这个逻辑必须被移动到不同的层,例如你的控制器/表示层。
放弃现有数据库并使用“代码优先迁移”生成基于默认约定的新数据库。您必须使用SSIS,SSMS数据导入工具或手动插入 - 选择语句将旧数据库中的数据导入新数据库。
使用自定义实体类型配置映射和映射约定,在Code First范例中将现有模型映射到现有数据库。您将失去很多EF为您处理此样板文件的能力,但您将能够保留现有的域模型,并且几乎可以完全控制域模型转换为数据层的方式。
编辑数据库优先范例的映射模板文件,以在生成的类中包含自定义业务逻辑。这个解决方案很快变得非常笨拙,但是它会为POCO域类的其他一些必要条件做好准备。
编辑数据库优先映射模板以生成部分域类,这些类将与包含自定义业务逻辑的开发人员编码的部分声明配对。允许在域中包含业务逻辑功能,而模板中没有太多遗留问题,但它有其自身的限制;例如,你只能以这种方式添加函数和非映射属性,你不能创建将映射到数据库的自定义属性(虽然你可以创建一个自定义属性来“包装”一个映射的属性,这将创建一个非常令人困惑的模型依赖于编码器约定来确定使用代码消耗哪个属性。