实体框架4 TPH继承,如何将一种类型转换为另一种?

e36*_*6M3 5 c# asp.net asp.net-mvc entity-framework entity-framework-4

我已经找到了一些有关这方面的信息,但还不足以让我理解这种情况的最佳实践.我有你的典型TPH设置与抽象基类"公司".我有几个孩子"小公司","大公司"等继承自公司.实际上,我实际上对公司有不同的现实分类,但我试图在这个例子中保持简单.在根据TPH的数据库中,我有一个具有FirmTypeId列(int)的Firm表,用于区分所有这些类型.一切都很好,除了我要求允许用户将一种类型的公司改为另一种.例如,用户在添加公司时可能会犯错,并希望将其从Big Firm更改为Small Firm.因为实体框架不允许将区分数据库列暴露为属性,所以我不相信有一种方法可以通过EF将一种类型更改为另一种类型.如果我错了,请纠正我.我看到它的方式我有两个选择:

  1. 不要使用TPH.只需拥有一个公司实体并返回使用.Where(FirmTypeId == something)来区分类型.
  2. 使用context.ExecuteStoreCommand直接执行SQL以更新数据库的FirmTypeId列.

我看过一篇文章,人们认为OOP的一个原则是实例不能改变它们的类型.虽然这对我来说很有意义,但我似乎无法连接点.如果我们遵循这个规则,那么唯一一次使用任何类型的继承(TPH/TPT)就是确定一种类型永远不会转换为另一种类型.因此,小公司永远不会成为一家大公司.我看到应该使用构图的建议.即使它对我来说没有意义(意思是我没有看到公司如何拥有一家大公司,对我来说,一家大公司就是一家公司),我可以看到如果数据存在,如何在EF中建模组合.多个表.但是,在我在数据库中有一个表的情况下,它似乎是TPH或我在上面#1和#2中描述的内容.

Mor*_*avi 1

是的,你说得对。EF继承不支持这种情况。更改现有公司的公司类型的最佳方法是使用存储过程。

请查看这篇文章以获取更多信息:
更改实体框架中的继承类型