2016-11-16 59 views
0

我有一個實體類Timecard,我從這個方法得到這個實體:奇怪,實體框架是節省分離實體正確

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

timecardContext是TimecardContext: DbContext型。

後來我做出改變的Timecard實體,該Timecard實體有一個屬性:

public virtual ICollection<TimecardRow> TimeCardRows { get; set; } 

被初始化,在Timecard's構造爲HashSet,像這樣:

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

我添加一個孩子TimecardRow然後我調用另一個方法,這是它的確切實現,並將其從同一個Timecard實例傳遞給GetTimeCardForPerson

public void SaveTimecard(Timecard timeCard) 
{ 
    timecardContext.Entry(timeCard).State = timeCard.TimecardId == 0 
     ? EntityState.Added 
     : EntityState.Unchanged; 


    timecardContext.SaveChanges(); 
} 

Timecard timeCard參數傳遞的是沒有連接到timecardContext並具有TimecardId> 0

我很驚訝,我的新TimecardRow成功保存爲輸入(timeCard.State)設置爲EntityState.Unchanged

EntityState.Unchanged告訴我的timecardContext沒有什麼改變,不是嗎?但是完全相同,當調用SaveTimecard方法時,我添加的TimecardRow被插入到數據庫中。

+0

是否將TimeCard實例從GetTimeCardForPerson中返回,這是您隨後對SaveTimecard進行更改並傳遞給SaveTimecard的同一實例? – thudbutt

+0

@thudbutt它是相同的Timecard實例,感謝您的幫助 –

回答

3

EntityState.Unchanged通知上下文沒有任何變化的實體的時間卡實體。

TimecardRow是一個單獨的實體,EF將單獨跟蹤,因此對SaveChanges的調用將插入該實體。

上面假定傳遞給Save方法時(如果它是從GetTimeCardForPerson方法返回的同一實例)Timecard已經連接。

如果在Save方法中使用Id檢查來處理分離和連接的實體,除非它的id爲0,否則最好是保持獨立狀態?

+1

當您執行timecardContext.Entry(timeCard).State = EntityState.Unchanged時,您將實體附加到此上下文中。所以毫不奇怪,這個新的環境開始追蹤時間卡及其孩子。 –

+0

Thanks @ E-Bat,我剛剛檢查過,它實際上是同一個TimecardContext實例,但你的信息是非常有幫助的 –

+0

@thudbutt,我認爲State = EntityState.Unchanged是故意的,因爲Timecard實體屬性不能改變,它們是隻讀,但客戶端擁有Timecard實體並可以進行更改 –