我只是希望在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; }
}
答案 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 来处理视图中一对多关系和多对多关系的教程。
希望这个答案能帮到你。