首先使用MVC / EF代码选择/创建子对象的正确方法是什么

时间:2011-05-09 17:15:19

标签: entity-framework asp.net-mvc-3 ef-code-first

我正在使用MVC3和Entity Framework Code First。 我有以下模型。

public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int MySubObjectId { get; set; }

    public virtual MySubObject MySubObject { get; set; }
}
public class MySubObject
{
    public int Id { get; set; }
    public string SubName { get; set; }
}

在我的MyObject创建页面上,用户可以选择要使用的现有MySubObject,也可以创建一个新的MySubObject(在MySubObject的编辑模板中选择或创建w / auto完整文本框)。

从绑定/控制器角度处理此问题的正确方法是什么。

如果该Id无效,我应该使用MySubObject.Id并创建一个新对象吗? 我应该只使用MySubObject.SubName并在将其发回控制器时查找ID吗?

我提出的所有内容在控制器方面看起来都很混乱。

2 个答案:

答案 0 :(得分:0)

您正在传递文字,但要建立您的关系,您需要Id,所以没有别的办法可以调用类似的东西:

var mySubObject = context.SubObjects.SingleOrDefault(o => o.Name == name);

如果返回值是实体,则可以使用它来与现有子对象建立关系。如果得到null,则表示必须创建新的子对象。只需创建一个新实例并将其分配给主对象的导航属性,就应该强制插入。

很少注意到:

  • 如果要执行此操作,则应在子对象的Name上定义唯一键。 EF不支持唯一键,因此您必须直接在数据库中执行 - 首先是代码use custom database initializer
  • 请注意,名称比较的区分大小写将基于数据库的排序规则

答案 1 :(得分:0)

ViewBag可用于存储选择列表,然后在下拉框的视图中使用该列表。

在控制器中

ViewBag.MySubObjectId = new SelectList(db.MySubObjects, "MySubObjectId", "SubName", model.MySubObjectId);

然后在视图中

@Html.DropDownList("MySubObjectId", String.Empty)