多对多关系读写

时间:2016-04-09 07:49:41

标签: sql-server asp.net-mvc database

我只是希望在ASP.NET MVC项目中获得关于多对多关系的链接表的清晰度。创建Controller和视图时,似乎没有任何代码可以读取和写入链接表!?唯一自动生成的是OrderEmployee表。

如果我理解正确,对于我创建的每个订单,我还需要在OrderEmployee表中添加处理它的员工的ID?当我想列出Oders并想知道处理该订单的每个员工时,我需要读取OrderEmployee表吗?我无法找到有关如何读取和写入链接表的任何教程。

我是否必须在控制器中自行添加此读写代码?如果我能对此有所了解,请提前确定!

public class Order
{
public int ID { get; set; }
public string Name { get; set; }
public int? ManufacturerID { get; set; }
public virtual Manufacturer Manufacturer { get; set; }
public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public int EmployeeNumber { get; set; }
public virtual ICollection<Timeunit> Timeunits { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}

1 个答案:

答案 0 :(得分:0)

在多对多的关系中进行阅读和写作并不是很困难,但在开始时很难做到正确。 您不必在模型中添加任何内容,它们是正确的。

编写

我将向您展示如何使用下拉列表向员工添加单个订单的示例。向员工添加多个订单的概念几乎相同,您可以在底部找到一个带有教程的链接。

首先,您应该像这样创建查看模型

public class CreateEmployeeViewModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int EmployeeNumber { get; set; }

    public int SelectedOrderID { get; set; }
    public SelectList OrdersList { get; set; }
}

然后在 EmployeesControler

    // GET: Employees/Create
    public ActionResult Create()
    {
        /* Add this */
        CreateEmployeeViewModel model = new CreateEmployeeViewModel();
        model.OrdersList = new SelectList(db.Orders.ToList(), "ID", "Name");

        return View(model);
    }

第一个参数将是您要在其中选择内容的对象列表(在本例中为Order)。第二个参数是您要传递给视图模型的订单属性的名称(作为 SelectOrderID ),最后第三个参数是您要在下拉列表中显示的值。

Create.cshtml 中,将第一行替换为:

@model TestStackOverflow.Models.CreateEmployeeViewModel

接下来在 Html.BeginForm 中添加下拉列表:

<div class="form-group">
        @Html.LabelFor(model => model.OrdersList, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.SelectedOrderID, Model.OrdersList, new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.SelectedOrderID, "", new { @class = "text-danger" })
        </div>
    </div>

现在你应该在创建视图中有this

然后返回 EmployeesControler 并找到 POST 方法进行创建并将其替换为:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CreateEmployeeViewModel model)
    {
        if (ModelState.IsValid)
        {
            Employee employee = new Employee()
            {
                Name = model.Name,
                ID = model.ID,
                EmployeeNumber = model.EmployeeNumber,
                Orders = new List<Order>()
            };
            employee.Orders.Add(db.Orders.Where(x => x.ID == model.SelectedOrderID).FirstOrDefault());
            db.Employees.Add(employee);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(model);
    }

它将根据视图模型值创建一个新的Employee,并向此Employee添加一个订单。现在,如果您检查 OrderEmployees 表,您会看到在添加员工时创建了新条目。

读取值比编写简单。 如果您想阅读处理订单的所有员工,请执行此操作(我从订单中获取 Index.cshtml 来演示订单)

在文件顶部添加:

@using YourNameSpace.Models

现在进一步修改文件。它应该是这样的:

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.ManufacturerID)
    </td>
    <td>
        @foreach (Employee e in item.Employees)
        {
            @e.Name <br />
        }
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
        @Html.ActionLink("Details", "Details", new { id=item.ID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.ID })
    </td>
</tr>

}

Here您可以找到有关如何使用 SelectList 来处理视图中一对多关系和多对多关系的教程。

希望这个答案能帮到你。