C# 在数据库+MVC4中创建新记录时出现问题
我在数据库中有两个表PartyRole和PartyRoleType,其应用程序中的模型为: PartyRole:C# 在数据库+MVC4中创建新记录时出现问题,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我在数据库中有两个表PartyRole和PartyRoleType,其应用程序中的模型为: PartyRole: public partial class PartyRole : ILockable, IAuditable, IOverTime { /*** Construtor(s) ***/ public PartyRole() { } public PartyRole(PartyRoleType obj) : this()
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; }
}
填充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>
为什么不在数据库中插入一些伪PartyRoleTypes呢?看来你是想先车后马,除非我误解了-你有PartyRoleType中的数据吗?。在PartyRole课程中,您有:
[Required]
public int PartyRoleTypeId { get; set; }
所以必须至少定义一个PartyRoleType。至于为什么它试图为你插入一个我不确定-但当我有这样的关系-我总是插入一些虚拟类型的参考
接下来,在你的评论之后,我发现这不是问题所在
这里发生了什么:
obj.Party.PartyId = obj.PartyId;
obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId;
obj属于PartyRole类型,在PartyRole类中,我看不到Party的定义。那么你是如何设置obj.Party.PartyId的呢?PartyRole类是否已传递到您的Action方法的某个视图模型中?我们需要将null传递给PartyRole的PartyRoleType属性,以便不创建子对象: 我有很多PartyRoleType的数据。来自PartyRoleType的标题,我在mvc视图的下拉列表中显示它,以便用户可以为他正在创建的partyrole复制一个类型。PartyRoleTypeId是PartyRole中的外键。我们定义不在PartyRoleType中插入任何伪数据,因为创建新类型是一个不同的过程。我们从客户那里得到允许的类型列表,并以不同的方式更新这些表。这里有一些关于Unitofwork的内容。保存,我们并不总是希望它创建子记录,这是错误的!!!是的,这绝对是错误的:。那就奇怪了,恐怕我误解了。您可以显示填充PartyRoleType下拉列表的代码吗?传递到controller的PartyRole类是整个PartyRole模型对象。您可以忽略行-obj.Party.PartyId=obj.PartyId;,这是因为Party是PartyRole的另一个孩子而添加的。我更新obj.PartyRoleType.PartyRoleTypeId=obj.PartyRoleTypeId的原因;is-partyrole对象有子对象partyrole,它的partyroletypeid为null,unitofwork引发引用完整性约束错误,因此我已显式更新partyroletypeid。
[Required]
public int PartyRoleTypeId { get; set; }
obj.Party.PartyId = obj.PartyId;
obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId;