簡體   English   中英

使用實體框架刪除和插入實體

[英]Deleting and Inserting Entity with Entity Framework

假設我有兩個實體E1E2都共享相同的Code值。 假設我要刪除第一個並插入下一個:

Item.Delete(E1);
Item.Insert(E2);
Item.Save();

哪里

public void Delete(Entity E) 
{
    var existingEntity = _context.EntityTable.SingleOrDefault(s => s.Code == E.Code);
    _context.EntityTable.Remove(existingEntity);
}

public void Insert(Entity E)
{
    var existingEntity = _context.EntityTable.FirstOrDefault(s => s.Code == E.Code);
    if (existingEntity != null){
        throw new ArgumentException("Item alread exists.")
    }

    var newEntity = CreateDbEntity(E); // Create Db Entity just convert the type. Nothing much here.
    _context.EntityTable.Add(newEntity);
}

public void Save()
{
    _context.SaveChanges();
}

這里的問題是,當我從EntityTable中的_context刪除E1時,直到保存我的E1 EntityTable立即反映出來。 因此,該操作將失敗,因為由於E1仍然存在,所以無法成功插入E2窗台。 是否有解決方法, EntityTable確實反映了所做的更改?

每次操作后SaveChanges調用SaveChanges

您希望在初始化上下文時進行事務處理(這確保兩個操作都被執行):

_context = new FooEntities();
_transaction = _context.Database.BeginTransaction();

然后,您的Save方法將提交事務:

_transaction.Commit();

處置上下文和事務不會有什么壞處,但是我相信您已經做到了;)


附帶說明一下,由於您仍然會引發異常:

if (existingEntity != null){
    throw new ArgumentException("Item alread exists.")
}

為什么不在“代碼”列上創建唯一約束 這樣數據庫就會拋出異常;)

看來您只是有一個操作順序錯誤,這可能不是最有效的方法,但它應該解決您的問題。

Item.Delete(E1);
Item.Save();
Item.Insert(E2);
Item.Save();

按此順序打電話給他們。

或者,您可以將save方法添加到delete和insert方法中,以便在執行每個方法時保存它,而您只需要使用兩行即可。

public void Delete(Entity E) 
{
    var existingEntity = _context.EntityTable.SingleOrDefault(s => s.Code == E.Code);
    _context.EntityTable.Remove(existingEntity);
    Save()
}

public void Insert(Entity E)
{
    var existingEntity = _context.EntityTable.FirstOrDefault(s => s.Code == E.Code);
    if (existingEntity != null){
        throw new ArgumentException("Item alread exists.")
    }

    var newEntity = CreateDbEntity(E); // Create Db Entity just convert the type. Nothing much here.
    _context.EntityTable.Add(newEntity);
    Save()
}

public void Save()
{
    _context.SaveChanges();
}

然后你可以這樣稱呼它

Item.Delete(E1);
Item.Insert(E2);

希望這可以幫助! 如果沒有讓我知道,我將刪除答案(我必須使用答案,因為我不能評論低於50 rep,否則在回答之前,我會使用評論獲得更多的清晰度)干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM