2016-04-04 16 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; } 

このコードは動作します(両方の姓を節約しますそして、DBへのPhoneNumber):

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(); 

作品を入力しますが、やり過ぎと思われる条件ロジックを含み、 。私はそれなしで働いているのを見たいと思います。

関連する問題