在数据库+MVC4中创建新记录时出现问题

本文关键字:问题 新记录 创建 数据库 +MVC4 | 更新日期: 2023-09-27 18:21:00

我在数据库中有两个表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; }
}

PartyRoleType:

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; }
}

我们正在使用工作单元和存储库模式来和数据库对话。

我将显示一个屏幕(基本上是MVC视图)来创建一个新的参与方角色或编辑eixsting参与方角色。

以创建一个新的政党角色为例。我将填写FromDate&ThruDate和我将从PartyRoleType下拉列表中选择它将属于的PartyRoleType,然后单击保存。

我收到一个错误,需要PartyRoleType标题、NameInUse等。我从PartyRoleType模型中删除了所需的数据注释,因为我们不从UI中填充Type表。

这个错误已经消失了,但我得到了另一个错误,它不能在标题名称中插入null等,

基本上,如果我试图创建一个新的PartyRole,那么工作单元也将尝试在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>

在数据库+MVC4中创建新记录时出现问题

为什么不在数据库中插入一些伪PartyRoleTypes?你似乎是在本末倒置(除非我误解了——你在PartyRoleType中有数据吗?)。在你的PartyRole课程中,你有:

[Required]
public int PartyRoleTypeId { get; set; }

因此,必须至少定义一个PartyRoleType。至于为什么要为你插入一个,我不确定,但当我有这样的关系时,我总是插入一些伪类型来引用。

接下来,在你的评论之后,我认为这不是问题所在。

这里发生了什么:

obj.Party.PartyId = obj.PartyId;
obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId;

obj的类型是PartyRole,在您的PartyRole类中,我看不到Party的定义。那么,你是如何设置object.Party.PartyId的呢?传递到Action方法中的PartyRole类是某种视图模型吗?

我们需要将null传递给PartyRole的PartyRoleType属性,以便不创建子级。:)