2010-08-05 28 views
2

我有一個ToDo類,它具有Staff和Priority的屬性。如果用戶更新了待辦事項項目,改變了TASKNAME,也許設置一個新的優先級我怎麼更新Priority屬性 -如何使用Entity Framework更新嵌套屬性

public class ToDo : BaseEntity 
{ 
    public DateTime? DueDate { get; set; } 
    public String Notes { get; set; } 
    public virtual Priority Priority { get; set; } 
    public virtual Staff Staff { get; set; } 
    public String TaskName { get; set; } 
} 

在我的WinForms代碼中,我有以下保存方法:

private void Save()  
{  
    var todo = new ToDo  
    {  
     ID = ToDoID,  
     Staff = ddlStaff.SelectedValue,  
     Priority = ddlPriority.SelectedValue,  
     TaskName = txtTaskName.Text.Trim(), 
     Notes = txtNotes.Text.Trim(), 
     DueDate = String.IsNullOrEmpty(txtDueDate.Text) ? DateTime.Now : DateTime.Parse(txtDueDate.Text.ToString()) 
}; 

_todoController.SaveOrUpdate(todo); 

}

UI具有Staff和Priority的下拉/組合列表,但ddlPriority.SelectedValue不是Priority對象。我可能調用數據庫傳遞SelectedValue返回Priority對象,然後將其傳遞到ToDo對象,但這似乎很瘋狂只是爲了創建/維護ToDo項目和它的優先級之間的關係。

回答

0

您也可以改爲設置並獲取名爲PriorityId的其他屬性。這是Web應用程序中非常常見的情況,因爲它們是無狀態的。

編輯:你也可以做這樣的事情:

var selectedStaff = new Staff(); 
selectedStaff.Id = 2; 
context.Staff.Attach(selectedStaff); // The important part. 

var todo = new ToDo  
{  
    ID = ToDoID,  
    Staff = selectedStaff, 
    Priority = ddlPriority.SelectedValue,  
    TaskName = txtTaskName.Text.Trim(), 
    Notes = txtNotes.Text.Trim(), 
    .... 
} 

context.SaveChanges(); 

調用context.Staff.Attach(someStaffObject)基本上增加了工作人員對象範圍內,使其能夠被引用。在致電Attach()之前,您必須確定您設置了鑰匙

+0

通常我使用fk(PriorityID)方法,但所有的例子似乎只是引用了實體而不是Id,我想看看對我來說這是如何解決的。能夠對實體進行查詢是一個很好的好處 - 但爲了更新ToDo,往返數據庫關心我。我也有一個工作人員的關係,這將是另一次旅行,這是一個只有兩個關係的「簡單」對象,那些更復雜的關係呢? – 2010-08-05 20:38:10

+0

@Simon - 大多數例子都有參考方法,因爲它們是示例。它們不適合真實世界的場景。一個更「複雜」的對象仍然會使用上面描述的PK/FK方法。看到我的編輯上面的另一種方式(這可能是你想要做的)。 – TheCloudlessSky 2010-08-05 21:28:25