【问题标题】:asp.net mvc EntityTypeConfigurationasp.net mvc EntityTypeConfiguration
【发布时间】:2017-12-08 17:52:40
【问题描述】:

请说明一下... 我有一个 Employee 和 Department 实体模型,具有如下所示的一对多关系

namespace Entities
{
    public class Employee
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Department Department { get; set; }
    }
}

namespace Entities
{
    public class Department
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public  ICollection<Employee> Employees { get; set; }
    }
}

为了使我的实体类更干净,我使用了 EntityConfiguration 类来声明如下注释..

namespace Entities.EntityConfiguration
{
  public  class EmployeeConfiguration : EntityTypeConfiguration<Employee>
    {
        public EmployeeConfiguration()
        {
            Property(e => e.FirstName).IsRequired().HasMaxLength(10);

            Property(e => e.LastName).IsRequired().HasMaxLength(10);

HasRequired(a=>a.Department).WithMany(a=> a.Employees).Map(x=> x.MapKey("DepartmentID"));
        }
    }
}

我在员工控制器中的“创建”视图的一部分如下所示

<div class="form-group">
           @Html.LabelFor(model => model.Department, "Department", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("Department", @ViewBag.Department as SelectList,"--Please Select--", htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.Department, "", new { @class = "text-danger" })
           </div>
       </div>

在“创建”后置方法中,我得到了下面这样的员工值

在上面,“部门”显示为空。

但我想拥有这样的价值观

我的问题是:如果我想在这里使用“DepartmentID”,那么我必须像下面这样更改我的员工模型类。

namespace Entities
{
    public class Employee
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public int DepartmentID { get; set; }
        [ForeignKey("DepartmentID")]
        public Department Department { get; set; }
    }
}

即我必须在我的员工模型类中输入数据注释, 那么在 EntityConfiguration 类中指定相同的有什么用。 实际上,我想在“创建”后方法中使用“部门 ID”,但我不想用数据注释使我的员工类混乱。

另外,如何在“Create” Post 方法中访问“Department”实体值?

请为此提出您的建议和任何其他出路。

非常感谢。

【问题讨论】:

  • 如果您将视图更改为 DropDownListFor(m => m.Department.ID... 问题是您尝试将单个 ID 值映射到完整的部门对象。模型绑定器是'不够聪明,不能这样做。我实际上建议在这里使用视图模型并在控制器操作中映射回您的实体。
  • @Fran: 如果我使用 '@Html.DropDownListFor(m=>m.Department.ID .... )' 那么它将在 db 表中添加一个部门实体的新条目,我不需要。我很困惑如何完成它...我只想要 post 方法中的“Employee”参数中的 DepartmentID 字段,我也在员工的配置类中添加了该字段:(
  • 你不需要 [ForeignKey("DepartmentID")] 因为你有流畅的代码告诉 EF 那是 FK。实际上你甚至不需要流利的代码,因为 EF 可以说它是 FK。 ViewModel pattern 确实解决了您遇到的许多问题。在 [GET] 中构建它,将其传递给视图,在 [POST] 中处理它。非常干净,不需要 ViewBag。
  • @Steve Greene:是的,按照惯例,EF 会将 FK 设为员工表中的“Department_ID”,因此我使用 fluent api 将其更改为“DepartmentID”。现在,如果不使用 Viewmodel 概念,是否无法在“Create”的 Post 方法中获取此 DepartmentID ?我想要 post 方法中的 'Employee' 参数中的 DepartmentID 字段。

标签: asp.net-mvc asp.net-mvc-5 ef-fluent-api


【解决方案1】:

如果您的实体模型像这样公开 DepartmentId:

public class Employee
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int DepartmentID { get; set; }
    public Department Department { get; set; }
}

然后在 [HttpGet] 中构建你的 ViewBag:

ViewBag.Departments = _RepoDepartment.Select(x => new SelectListItem {
   Text = x.IDToString(), 
   Value = x.Name 
}).ToList();

现在在你看来:

@Html.DropDownListFor(model => model.DepartmentID, ViewBag.Departments as IEnumerable<SelectListItem>)

现在,当您选择一个部门时,它的 DepartmentID 将被发回。还有其他方法可以做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多