實體框架SaveChanges()不起作用?

c#-3.0 entity-framework

我在Visual Studio 2008中使用實體框架,確定它既是.NET Framework又是VS本身。我的應用程序是在n層環境中開發的。第一步,我將數據從上下文轉換為集合併序列化為用戶。

HRMSDBContext context = new HRMSDBContext();

List<InHouseTrainingHead> heads = context.InHouseTrainingHead.ToList<InHouseTrainingHead>();

foreach (InHouseTrainingHead head in heads)
{
    context.Detach(head);
}

return heads;

用戶更改某些數據並單擊“保存”後,此列表將返回save方法。

HRMSDBContext context = new HRMSDBContext();

foreach (InHouseTrainingHead head in lists)
{
    context.Attach(head);
    context.ApplyPropertyChanges(head.EntityKey.EntitySetName, head);
}

context.SaveChanges();

不幸的是在SaveChanges()之後沒有任何事情發生。我怎麼解決這個問題?

一般承認的答案

您沒有按照預期的方式使用ObjectContext.ApplyPropertyChanges 。您需要實體的兩個實例 - 附加到上下文的未修改實例和分離的修改實例。然後將更改應用於未修改的附加實體,它將被修改,您可以保存更改。因此,在調用ObjectContext.ApplyPropertyChanges之前,不得附加修改後的實體,而是從數據庫加載實體。


熱門答案

擴展DanielBrückner的答案 - 你的樣本中發生的事情是你正在嘗試在head對象和它自身之間應用ApplyPropertyChanges 。顯然,沒有變化,因此沒有任何東西得救。但是,如果您不想從數據庫中獲取記錄,則可以手動將新連接的實體的EntityState設置為“已Modified 。在這種情況下,它將保存在DB中:

HRMSDBContext context = new HRMSDBContext();

foreach (InHouseTrainingHead head in lists)
{
    context.Attach(head);
    ObjectStateEntry addedEntity = context.ObjectStateManager.GetEntry(head);
    addedEntity.ChangeState(EntityState.Modified);
}

context.SaveChanges();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因