以“错误”方向投射实体框架实体

时间:2009-03-26 11:41:12

标签: entity-framework inheritance

我正在使用实体框架,并且具有基本实体(我们称之为Customer)和派生实体的继承结构,我们称之为AccountCustomer。不同之处在于,AccountCustomer具有存储在数据库中单独表格中的额外详细信息(例如付款条件等),因此存在于实体中的额外属性。

我希望允许用户“宣传”特定客户成为AccountCustomer。我需要保留相同的主键(用户可以看到复合键并用作客户参考)。

目前我的感觉是调用存储过程在Accounts表中创建附加记录是唯一的方法,但到目前为止我们还没有绕过实体框架,所以如果可能的话,我宁愿避免这种技术

是否有任何实体框架专注于解决方案?

2 个答案:

答案 0 :(得分:4)

这是“请不要这样做”的情景之一。

您正在严格按照表格来考虑这一点,而不是以面向对象的术语。

特定客户是特定客户。他永远不会改变这种事。现在,他的状态可能会改变,或者他可能会获得额外的AccountProperties,但他从不会从一种事物(客户)转变为另一种事物(AccountCustomer)。它在概念上根本没有意义(一般的水果不会变成苹果,不是吗?不!它起初是一个具有一种状态的苹果,最终成为具有新状态的苹果),它当然是在.NET面向对象编程中是不可能的...这将使其无法在像EF这样的ORM中使用。

因此,请考虑一种合理的方法来概念化这一点,这将导致以面向对象的术语表达这一点的合理方式,这将导致一个合理的EF解决方案。

答案 1 :(得分:0)

我通过解决方法解决了这个问题。

  • 加载基类的所有相关导航属性,包括其自身

var customer = db.Customers.Include("whatever dependince you have").FirstOrDefault(u=>u.UserId == userId); //你可以为你的所有内容重复这个

  • 将导航属性缓存到本地变量,即var profile = customer.Profile;
  • db.Customer.Remove(customer);
  • 删除基类
  • 创建开源课程var accountCustomer = new AccountCustomer();
  • 从基类设置其所有属性和导航属性,即

accountCustomer.UserId = customer.UserId;

accountCustomer.Profile = profile; // do the same for all of the properties and navigation properties from the base class

  • 将新类添加回db

this.Entry<T>(accountCustomer).State = EntityState.Added;

  • 致电db.SaveChanges()

就是这样!