使用 MVC 5 和 Entity framework 的关联实体下拉列表

Dropdown of associated entities using MVC 5 and Entity framework

我正在使用 MVC 5 和 Entity Framework。我有 2 个实体,一个 Person 和一个 PersonType。我在它们之间创建了一个 Association,这样一个 Person 就有一个 PersonType 属性 :

namespace Test.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Person
    {
        public int PersonId { get; set; }
        public virtual PersonType personType { get; set; }
    }
}

此代码由实体数据模型 (.edmx) 生成。

然后,在控制器中,我将所有 PersonType 添加到 ViewBag,以便可以将它们添加到页面的下拉控件中:

ViewBag.PersonTypeList = new SelectList(db.PersonTypes, "Id", "Description");

页面的模型设置为 'Person' 并包含一个下拉菜单:

<div class="form-group">
    @Html.LabelFor(model => model.personType, "Person Type", htmlAttributes: new { @class = "control-label col-md-4" })
    <div class="col-md-8">
        @Html.DropDownListFor(model => model.personType.Id, ViewBag.PersonTypeList as SelectList, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.personType.Id, "", new { @class = "text-danger" })
    </div>
</div>

这似乎工作正常,但在保存 Person 时,它似乎试图使用我选择的 Id 创建一个新的 PersonType,而不是简单地引用 PersonType table 已经?我做错了吗?非常感谢

如果您使用 .edmx 文件建立关系,您还应该得到一个 FK 属性,例如myPerson.PersonType_Id(通常名字是{classname}_{PKfieldname})。
如果该字段已存在,请将下拉列表中选择的 ID 分配给该字段 属性.

但是edmx生成有bug

大约一年前我注意到了这一点,它只在非常特殊的情况下才会发生。

当您通过 .edmx 建立关系时(右键单击 > 添加 > 关联...),您将得到一个 window 要求您 select 您希望的两个实体相关。

对于一对多关系,您必须确保 MANY-entity 在 window. 的右侧(就像在图像中一样以上)

向导完美地允许您做相反的事情(如果您从左到右阅读它,基本上设置多对一)。如果你这样做,我提到的那个辅助 FK 字段将不会被设置。

如果未设置该字段,而您尝试通过 .PersonType 字段添加它,EF 似乎经常尝试创建该对象。

要解决此问题,您必须删除关联,并在 MANY 实体位于 window 的右侧时再次添加它。

对于你的情况,这意味着 PersonType 应该在左边,Person 应该在右边。

完成后,让您的下拉列表填写 PersonType_Id 字段(如果您使用默认 PK,则应为 int)。将 PersonType 属性 留空,并保存刚刚创建的 Person 对象。
然后 EF 应该正确地查找现有的 PersonType 而不是尝试创建一个新的

你能确认这个解决方案是否适合你吗?

我想你在剃须刀中提到了
型号=>model.personType.Id 在下拉列表中,这似乎是个问题。再添加一个 属性 人员类型Id in class person 显然映射到外键 table。并将 model=>model.personType.Id 编辑为 model=>model.personTypeId 在剃须刀的下拉列表中。