2016-04-04 41 views
0

我有一个简单的TPH层次:保存更改到子类的属性

public abstract class UserAccount 
{ 
    public string FirstName { get;set; } 
} 

public class InterpreterAccount : UserAccount 
{ 
    public string PhoneNumber { get;set; } 
} 

和的DbContext:

//....... 
public DbSet<UserAccount> UserAccounts { get; set; } 
public DbSet<InterpreterAccount> InterpreterAccounts { get; set; } 

此代码(既节省了名字和PhoneNumber到DB):

var account = _context.InterpreterAccounts.Single(i => i.Id == id); 
account.FirstName = "Ivan"; 
account.PhoneNumber = "+123"; 
_context.SaveChanges(); 

而这不保存PhoneNumber属性

var account = (InterpreterAccount)_context.UserAccounts.Single(i => i.Id == id); 
account.FirstName = "Ivan"; 
account.PhoneNumber = "+123"; 
_context.SaveChanges(); 

但是在实际情况下,只有在检索到对象后才知道对象的类型,因此需要查询基本集合。

所以问题是:如何保存通过查询EF7中的基础对象集合检索到的TPH层次结构派生对象的更改?

+0

你可以包含'OnModelCreating()'的Fluent API吗? –

回答

1

...并在接下来的10分钟内找到了解决方案。尽管如此,仍然看起来有点丑陋。

要更改保存到经由基础对象集合中检索派生对象,我不得不1)查询分离对象和2)连接至收集基于它的类型

var account = _context.UserAccounts.AsNoTracking().Single(i => i.Id == id); 
account.FirstName = "Ivan"; 
if (account is InterpreterAccount) 
{ 
    _context.InterpreterAccounts.Attach(account); 
    ((InterpreterAccount)account).PhoneNumber = "+123"; 
} 
_context.SaveChanges(); 

工程,但涉及这似乎矫枉过正条件逻辑。我希望看到它没有它的工作。