我需要一些关于最佳实践的指导。
我有两个SQL表,一个名为Person,其中包含PersonId,PersonName,另一个名为Category,其中包含CategoryId,CategoryName。类别可能非常多,偶尔会添加。
我想要一个创建视图,它显示PersonName的文本框,然后是Category表中每个类别的单个复选框。
用户可以输入名称并根据需要勾选多个类别复选框,然后保存。
是否在Person表中插入PersonName然后在名为PersonCategory的新表中插入每个人/类别组合的条目是正确的方法,该表包含字段PersonId和CategoryId?
如果我这样做,如果在编辑视图中更改类别,我该如何处理更新?这是一个类别可能是针对一个人不受控制的。是否需要删除PersonCategory中的记录?
答案 0 :(得分:3)
通常,对于这样的事情,我会避免更新。我会从PersonCategory
中删除给定人员的所有条目,然后重新插入PersonCategory
中保存的条目。
答案 1 :(得分:1)
您的问题的答案是肯定的,在添加/删除的地方添加/删除它们,是的。
这是一个多对多关系,使用链接表以关系方式表示。
答案 2 :(得分:1)
我就是这样做的。我将通过以下内容。
public class PersonViewModel
{
public int Id { get; set; }
public string PersonName { get; set; }
// For rendering Checkboxes in the MVC View
public IList<SelectListItem> CategoryCheckboxes { get; set; }
// For data binding on Postback (HTTP POST).
// <input type="checkbox" /> will have the same `name` attribute as this.
public IList<int> AssociatedCategories { get; set; }
}
<div>Name: <%= Html.EditorFor( m => m.PersonName ) %></div>
<fieldset>
<legend>Associatied Categories</legend>
<% foreach (SelectListItem c in Model.CategoryCheckboxes) { %>
<!-- 'name' attribute is same as the C# View Model property name -->
<%= Html.CheckBox( "AssociatedCategories", c.Selected, new Dictionary<string, object> { { "value", c.Value } } ); %>
<%= Html.Encode( c.Text ) %><br />
<% } %>
</fieldset>
[HttpPost]
public ActionResult Edit(PersonViewModel viewModel)
{
Person p = personService.Update( viewModel ); // persist changes to DB
if (p == null) // person record doesn't exist in DB
return RedirectToAction("NotFound");
return RedirectToAction("Edit", new { id = viewModel.Id });
}
// this is in the `PersonService` class.
public void Update(PersonViewModel viewModel)
{
Person p = personRepository.GetByPrimaryKey( viewModel.Id );
if (p == null)
return null;
p.PersonName = viewModel.PersonName;
IList<int> existingAssociatedCategories = GetAssociatedCategories( p.PersonId );
foreach( int i in viewModel.AssociatedCategories )
{
if (!existingAssociatedCategories.Contains( i ))
Associate( p.PersonId, i ); // add NEW association in DB
}
foreach( int k in existingAssociatedCategories)
{
if (!viewModel.AssociatedCategories.Contains( k ))
DeleteAssociation( p.PersonId, k ); // delete existing association
}
repository.UpdatePerson( p ); // save changes to DB for Person object
return p;
}
如果您有任何疑问,请与我联系。