2012-12-18 19 views
0

我想附加一個從未從數據庫'拉'的實體,並讓它更新現有的行。例如,我在MVC(修改)中傳遞了一個完整的模型,並且我只是試圖保存它而不用往返獲取實體,然後編輯,因爲我已經有了來自之前調用的信息。EF5我可以附加一個從未從Db查詢過的實體嗎?

什麼我是這樣的:

public static int ModifyExistingEntity<T>(this DbContext db, T updated) where T : class 
{ 
    DbSet<T> set = db.Set<T>(); 
    set.Attach(updated); 
    db.Entry(updated).State = EntityState.Modified; 
    return db.SaveChanges(); 
} 

但是當我運行它,我得到這個:

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:商店 更新,插入或刪除語句影響行數(0)的意外數量 。實體可能已被修改或刪除,因爲實體 已加載。刷新ObjectStateManager條目。 ---> System.Data.OptimisticConcurrencyException:存儲更新,插入或 刪除語句影響了意外數量的行(0)。自實體被加載後,實體 可能已被修改或刪除。刷新 ObjectStateManager條目。

這意味着什麼都沒有更新。我在這裏錯過了什麼?主鍵設置正確,但請記住,實體不是從數據庫中提取的,而是根據先前查詢的信息+更新構建的。

+0

從來沒有找到一個解決方案 - 請添加一個,如果你曾經遇到一個! – naspinski

回答

0

可能有些問題與靜態擴展您可以繼承嘗試,

public class MyContext:DbContext { 

    public int ModifyExistingEntity<T>(this DbContext db, T updated) where T : class 
    { 
    DbSet<T> set = Set<T>(); 
    set.Attach(updated); 
    this.Entry(updated).State = EntityState.Modified; 
    return SaveChanges(); 
    } 

} 
+0

這些工作都沒有 - 走了一條不同的路線 – naspinski

0
set.Attach(updated); 

,因爲它是連接實體上下文不變的狀態你不需要上面這行。您可能會獲得樂觀併發異常,因爲在附加此類時,由上下文跟蹤的原始值(db值)將被設置爲更新值的值。查看是否僅使用下面的行,因爲它將實體附加到上下文並設置狀態。

db.Entry(updated).State = EntityState.Modified; 

http://msdn.microsoft.com/en-us/data/jj592676.aspx

相關問題