如何使用Entity Framework更新嵌套属性

时间:2010-08-05 19:42:37

标签: c# entity-framework-4

我有一个ToDo类,它具有Staff和Priority属性。如果用户更新ToDo项,则更改TaskName并设置新的优先级如何更新Priority属性 -

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项目与其优先级之间的关系。

1 个答案:

答案 0 :(得分: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)基本上将staff对象添加到上下文以允许它被引用。在调用Attach()之前,您必须确保设置密钥属性。