2009-05-21 138 views
3

如何使用強類型的控制器與EntityObjects?實體框架與ASP.NET MVC

我的錯誤...

首先我嘗試這樣做:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

這未能真正保存到數據庫中的任何改變。所以,我試圖將模型附加到我的ObjectContext上:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    db.Attach(Model); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

由於「EntityKey值爲null的對象不能附加到對象上下文」,因此失敗。所以,我試圖指定的EntityKey「使用相同的密鑰對象已存在於ObjectStateManager的ObjectStateManager不能用相同的密鑰跟蹤多個對象」

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    Model.EntityKey = (from Department d in db.Department 
         where d.Id == id 
         select d).FirstOrDefault().EntityKey; 
    db.Attach(Model); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

這失敗,因爲

這應該如何工作?

+0

http://stackoverflow.com/questions/922402/strongly-typed-asp-net-mvc-with-ado-net-entity-framework – 2009-05-28 18:13:44

回答

1

嘗試db.AttachTo()而不是db.Attach()

如上所述here

「呼叫AttachTo上ObjectContext的對象附加到對象上下文中設置一個特定的實體。而且這樣做如果對象具有null(在Visual Basic中爲Nothing)EntityKey值。「

編輯:實際上,您可能需要在這種情況下調用ApplyPropertyChanges()。

編輯2:你可以建立你的對象實體鍵與類似下面的代碼:

public EntityKey GetEntityKey(string entitySetName, object keyValue) 
{ 
    IEnumerable<KeyValuePair<string, object>> entityKeyValues = 
    new[] 
    { 
     new KeyValuePair<string, object>("Id", keyValue) 
    }; 

    var key = new EntityKey(string.Concat("YOUR_OBJECT_CONTEXT_NAME.", entitySetName), entityKeyValues); 
    return key; 
} 

然後你會調用此方法,像這樣基於稱爲一個數據庫字段的實體按鍵'Id':

var entityKey = GetEntityKey(「Customer」,23);

我在自己的EF代碼中使用了類似的方法,但使用泛型類型參數來避免必須爲實體類名使用字符串。

+0

This works:Model.EntityKey = ...; db.ApplyPropertyChanges(「Department」,Model); db.SaveChanges(); – 2009-05-22 13:31:12

+0

但是,有沒有辦法不必執行數據庫查詢來確定EntityKey? – 2009-05-22 13:32:21

3

問題是,您所擁有的輸入不是具有改變的適當位置的完整模型對象 - 它只是新建立的「開始」,並且您想要覆蓋已存在的實體的所有屬性。你不發佈任何ID屬性,

這看起來有點冗長,但它是我找到的最好的,所以它是我在我的項目中做到的(調整到你的類名稱,不管是什麼缺失......):

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    var dbDepartment = (from Department d in db.Department 
         where d.Id == id 
         select d).FirstOrDefault() as Department 

    dbDepartment.Name = Model.Name; 
    dbDepartment.Color = Model.Color; 
    // etc, assigning values manually... 

    try 
    { 
     db.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     // oops... 
    } 
    return RedirectToAction("Index"); 
} 
0

我不建議使用POCO進入你的MVC應用程序。 您應該使用DTO或模型。

也許你應該先通過id檢索一個對象,然後用參數提供的值替換爲編輯方法,然後保存更改。 由於您沒有首先拆除模型,因此出現錯誤。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model) {
var entity=from m in db.Models where m.Id == Model.id select m;
Model entityAttached=entity.FirstOrDefault();
//replace all the new values in you object
db.SaveChanges();
}

或當您通過ID得到它,重視它回來時,你要保存的編輯方法,新的價值觀deattach對象。

1

這個怎麼樣

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, Department dept) 
{ 
    Department tmp = new Department() 
    { 
     Id = dept.Id 
    }; 
    try 
    { 
     db.Departments.Attach(dept, tmp); 
     db.Save(); 
    } 
} 

也許tmp的部分可以以一個的UpdateModel呼叫連接部分之後進行交換,但我不知道。

編輯:剛剛查看關於附件(實體e,實體原件)的文檔,它確實用e替換原件(或相應更新原件或w/e)。