2016-11-16 8 views
0

私は、エンティティクラスTimecardを持って、私はこの方法から、このエンティティを取得する:Entity Frameworkのは切り離さエンティティを保存していることに驚い正しく

public Timecard GetTimeCardForPerson(long timecardId) 
{ 
    return timecardContext.First(item => item.TimeCardId = timeCardId); 
} 

timecardContextはタイプTimecardContext: DbContextです。

私は後でTimecardエンティティに変更を加える、Timecardエンティティは、プロパティを持っています

そうのような HashSetTimecard'sコンストラクタで、初期化され
public virtual ICollection<TimecardRow> TimeCardRows { get; set; } 

:私は追加

this.TimeCardRows = new HashSet<TimecardRow>(); 

子供TimecardRow次に別のメソッドを呼び出し、これはその正確な実装で、GetTimeCardForPerson

012から返されたものと同じTimecardインスタンスを渡します。
public void SaveTimecard(Timecard timeCard) 
{ 
    timecardContext.Entry(timeCard).State = timeCard.TimecardId == 0 
     ? EntityState.Added 
     : EntityState.Unchanged; 


    timecardContext.SaveChanges(); 
} 

Timecard timeCard引数で渡さtimecardContextに取り付けられており、私はエントリ(timeCard.Stateが)EntityState.Unchangedに設定されているように私の新しいTimecardRowが正常に保存していることに驚いています> 0

TimecardIdを持っていません。

EntityState.Unchangedは、変更する必要がないことを私のtimecardContextに通知します。そうではありませんか?しかし、私が追加したTimecardRowは、SaveTimecardメソッドが呼び出されたときにデータベースに挿入されます。

+0

タイムカードのインスタンスがGetTimeCardForPersonから返されているのは、後でSaveTimecardに変更して渡している同じインスタンスですか? – thudbutt

+0

@thudbutt同じTimecardインスタンスです。ご協力ありがとうございます。 –

答えて

3

EntityState.Unchangedは、タイムカードのエンティティで何も変更されていないことをコンテキストに伝えます。

TimecardRowは、EFが個別に追跡する独立したエンティティであるため、SaveChangesを呼び出すとそのエンティティが挿入されます。

上記は、Saveメソッドに渡されたときにTimecardが既にアタッチされていることを前提としています(GetTimeCardForPersonメソッドから返された同じインスタンスの場合)。

SaveメソッドのIdチェックで、分離エンティティと添付エンティティの両方に対処する必要がある場合は、idが0でない限り、状態だけを残すほうがよいでしょうか?

+1

timecardContext.Entry(timeCard).State = EntityState.Unchangedを実行すると、このコンテキストにエンティティをアタッチしています。だから、この新しい文脈がtimeCardとその子を追跡し始めるのは驚きではありません。 –

+0

Thanks @ E-Bat、私はちょうどそれをチェックした、それは実際には同じTimecardContextインスタンスですが、あなたの情報は非常に有用です –

+0

@thudbutt、私はTimecardエンティティのプロパティは変更できないので、State = EntityState.Unchangedは意図的だと思います。読み取り専用ですが、クライアントはTimecardエンティティを持ち、変更を加えることができます –

関連する問題