我正在使用实体框架,并且具有基本实体(我们称之为Customer)和派生实体的继承结构,我们称之为AccountCustomer。不同之处在于,AccountCustomer具有存储在数据库中单独表格中的额外详细信息(例如付款条件等),因此存在于实体中的额外属性。
我希望允许用户“宣传”特定客户成为AccountCustomer。我需要保留相同的主键(用户可以看到复合键并用作客户参考)。
目前我的感觉是调用存储过程在Accounts表中创建附加记录是唯一的方法,但到目前为止我们还没有绕过实体框架,所以如果可能的话,我宁愿避免这种技术
是否有任何实体框架专注于解决方案?
答案 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
this.Entry<T>(accountCustomer).State = EntityState.Added;
db.SaveChanges()
就是这样!