【问题标题】:Issue while creating new records in database + MVC4在数据库 + MVC4 中创建新记录时出现问题
【发布时间】:2013-07-04 05:03:15
【问题描述】:

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

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

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

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

我收到一个错误,提示需要 PartyRoleType Caption、NameInUse 等。我从 PartyRoleType 模型中删除了所需的数据注释,因为我们不从 UI 填充类型表的任何方式。

该错误消失了,但是我收到另一个错误,它无法在标题名称使用等中插入空值,

基本上正在发生的事情是,如果我试图创建一个新的 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>

【问题讨论】:

    标签: c# asp.net-mvc-4


    【解决方案1】:

    为什么不向数据库中插入一些虚拟的 PartyRoleTypes 呢?似乎您正试图在马前插入购物车(除非我误解了 - 您在 PartyRoleType 中有数据吗?)。在您的 PartyRole 课程中,您有:

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

    因此必须至少定义一个 PartyRoleType。至于为什么它试图为你插入一个我不确定 - 但是当我有这样的关系时 - 我总是插入一些虚拟类型以供参考。

    继续前进,在您的 cmets 之后,我发现这不是问题。

    这里发生了什么:

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

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

    【讨论】:

    • 我在 PartyRoleType 中有很多数据。来自 PartyRoleType 的标题,我在 mvc 视图中的下拉列表中显示它,以便用户可以为他正在创建的派对角色选择类型。 PartyRoleTypeId 是 PartyRole 中的外键。我们绝对不会在 PartyRoleType 中插入任何虚拟数据,因为创建新类型是一个不同的过程。我们从客户那里获得允许的类型列表,并以不同的方式更新这些表。这里与Unitofwork.Save()有关,我们不总是希望这个创建子记录,那是错误的!!!
    • 是的,这绝对是错误的:)。那很奇怪,我怕我误会了。您能显示填充 PartyRoleType 下拉列表的代码吗?
    • 传入控制器的PartyRole类是整个PartyRole模型对象。您可以忽略 -obj.Party.PartyId = obj.PartyId; 这一行,这是因为 Party 是 PartyRole 的另一个孩子而添加的。我更新的原因 obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId;是 - partyrole 对象有子对象 partyrole 并且它的 partyroletypeid 为 null 并且 unitofwork 引发了引用完整性约束错误,所以我已经明确更新了 partyroletypeid。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多