我在数据库中有两个表 PartyRole 和 PartyRoleType ,其应用程序中的模型是:
派对角色:
public partial class PartyRole : ILockable, IAuditable, IOverTime
{
/*** Construtor(s) ***/
public PartyRole()
{
}
public PartyRole(PartyRoleType obj)
: this()
{
PartyRoleType = obj;
}
/*** Public Members ***/
[Key, Display(Name = "Id")]
public int PartyRoleId { get; set; }
[Required]
public int PartyRoleTypeId { get; set; }
[Required]
public int PartyId { get; set; }
/* IOverTime */
[Required, Display(Name = "From")]
public System.DateTimeOffset FromDate { get; set; }
[Display(Name = "Thru")]
public Nullable<System.DateTimeOffset> ThruDate { get; set; }
/* Navigation Properties */
/// <summary>
/// Foreign key to PartyRoleType: PartyRoleTypeId
/// </summary>
public virtual PartyRoleType PartyRoleType { get; set; }
}
派对角色类型:
public partial class PartyRoleType : ILockable, IAuditable, IEntity
{
/*** Construtor(s) ***/
public PartyRoleType()
{
PartyRoleTypePartyRoles = new List<PartyRole>();
}
/*** Public Members ***/
[Key, Display(Name = "Id")]
public int PartyRoleTypeId { get; set; }
/* IEntity */
public string Caption { get; set; }
public string NameInUse { get; set; }
public string Description { get; set; }
/* Navigation Properties */
/// <summary>
/// Foreign key from PartyRole: PartyRoleTypeId
/// </summary>
public virtual ICollection<PartyRole> PartyRoleTypePartyRoles { get; set; }
}
我们正在使用 unitofwork 和存储库模式来与数据库通信。
我将显示一个屏幕(基本上是 MVC 视图)来创建新的派对角色或编辑 eixsting 派对角色。
以创建一个新的政党角色为例。我将填写 FromDate 和 ThruDate,然后从 PartyRoleType 下拉列表中选择它所属的 PartyRoleType,然后单击保存。
我收到一个错误,提示需要 PartyRoleType Caption、NameInUse 等。我从 PartyRoleType 模型中删除了所需的数据注释,因为我们不从 UI 填充类型表的任何方式。
该错误消失了,但是我收到另一个错误,它无法将空值插入标题名称使用等,
基本上正在发生的事情是如果我试图创建一个新的 PartyRole,那么 unitofwork 也会尝试在 PartyRoleType 中创建记录。我认为它正在尝试在其所有孩子中创建记录,这也不应该发生。
有人可以建议如何处理这个问题还是我在这里做错了什么?
我的控制器:
[HttpPost]
public ActionResult Create(PartyRole obj)
{
obj.Party.PartyId = obj.PartyId;
obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId;
if (ModelState.IsValid)
{
PartyRoleRepo.Create(obj);
UnitOfWork.Save();
return RedirectToAction("List");
}
else
{
ViewBag.PossiblePartyRoleTypes = PartyRoleTypeRepo.All();
ViewBag.PossibleParties = PartyRepo.All();
return View();
}
}
填充 PartyRoleTypes 的代码:
<div class="l">
PartyRoleType
@(Html.DropDownListFor(O =>
O.PartyRoleTypeId,
((IEnumerable<PartyBiz.Models.Objects.PartyRoleType>)ViewBag.PossiblePartyRoleTypes)
.Select(OPT =>
new SelectListItem
{
Text = (OPT == null ? "None" : OPT.Caption),
Value = OPT.PartyRoleTypeId.ToString(),
Selected = (Model != null) && (OPT.PartyRoleTypeId == Model.PartyRoleTypeId)
}
),
"Choose...",
new { @class = "combo"}
)
)
@Html.ValidationMessageFor(o => o.PartyRoleTypeId)
</div>