【问题标题】:What is the right way to select/create sub objects with MVC /EF code first首先使用 MVC / EF 代码选择/创建子对象的正确方法是什么
【发布时间】:2011-05-09 17:15:19
【问题描述】:

我首先使用带有实体框架代码的 MVC3。 我有以下型号。

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 的编辑模板中使用自动完成文本框完成)。

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

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

我想出的所有东西在控制器方面似乎都很混乱。

【问题讨论】:

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


    【解决方案1】:

    您正在传递文本,但要建立您的关系,您需要 Id,因此没有其他方法可以调用类似:

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

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

    几点注意事项:

    • 如果您想这样做,您应该在子对象的Name 上定义唯一键。 EF 不支持唯一键,因此您必须直接在数据库中进行 - 代码优先 use custom database initializer
    • 请注意,名称比较的大小写敏感性将基于数据库的整理

    【讨论】:

      【解决方案2】:

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

      在控制器中

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

      然后在视图中

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

      【讨论】:

        猜你喜欢
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多