2016-07-22 23 views
2

這是POCO的Code First類:ASP.Net MVC。如何使用實體框架自動保持關係數據?

class Contact{ 
    [Key] 
    public int Id {get; set;} 
    public string name {get; set;} 
    public ICollection<Phone> phones{get; set;} 
} 

class Phone{ 
    [Key] 
    public int id {get;set;} 
    public string phone_type {get; set;} 
    public string phone_number {get; set;} 
    public Contact contact { get; set; } 
} 

我想堅持它DB。

這是控制器:

綁定的「接觸」實例確實包含一個列表的手機聯繫人與很多手機。

public ActionResult Edit([Bind()] Contact contact) { 
    if (ModelState.IsValid) 
    { 
     db.Entry(contact).State = System.Data.Entity.EntityState.Modified; 
     db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 
    return View(contact); 
} 

但是,這段代碼只保留了db上的Contact實例。電話表仍空。

是否有任何配置自動持續在數據庫相關的「電話」數據,或者必須手動編碼?

對於那些有興趣,該視圖是這樣的(簡化):

@model SGD.Models.Contact 
Name: @Html.EditorFor(model => model.name) 
Phones: <div id="phones"></div> 

其中#phones DIV填充與此部分與一個增量索引。

<input name="phones[@index].id" type="hidden" /> 
<input name="phones[@index].phone_type" /> 
<input name="phones[@index].phone_number" /> 
+1

請說明如何在視圖中添加/刪除手機 – octavioccl

+0

@octavioccl我添加了簡化視圖代碼。但我確定控制器可以正確地從視圖中綁定數據。這裏的問題只是堅持它在數據庫。 –

+1

您是否調試過您的操作以確保電話隨附聯繫人? – octavioccl

回答

1

現在我在讀,如果你只是改變StateModified根實體,相關實體不改變自己的狀態(reference):

注意,如果連接實體已經引用其他尚未被追蹤的 實體,則這些新實體將 附加到處於未更改狀態的上下文 - 它們不會自動被修改爲 。如果您有多個實體 需要標記爲修改,則應分別爲這些實體中的每一個設置狀態。

嘗試使用TryUpdateModel。我不完全確定它是否更新相關實體,但是如果您的模型綁定了相關實體,它應該是。

var contact= db.Contacts.Include(c=>c.Addresses).FirstOrDefault(c=>c.Id==contact.Id); 
TryUpdateModel(contact); 

我總是在這種情況下使用是一個ViewModel和我後來用Automapper

也有一個第三方庫(GraphDiff),讓您保存整個映射到我的實體之一將具有子實體和列表的模型/實體分離到數據庫,而無需編寫代碼。