0

データベースに PartyRole と PartyRoleType の 2 つのテーブルがあり、アプリケーションのモデルは次のとおりです。

パーティの役割:

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

unitofwork とリポジトリ パターンを使用してデータベースと通信しています。

パーティーロールの新規作成や既存のパーティーロールの編集を行う画面(基本的にはMVCビュー)をお見せします。

新しいパーティ ロールを作成するシナリオを考えてみましょう。FromDate と ThruDate を入力し、PartyRoleType ドロップダウンから所属する PartyRoleType を選択し、[保存] をクリックします。

PartyRoleType Caption、NameInUse などが必要であるというエラーが表示されます。UI からタイプ テーブルを埋める方法がないため、PartyRoleType モデルから必要なデータ アノテーションを削除しました。

そのエラーはなくなりましたが、null をキャプション nameinuse などに挿入できないという別のエラーが発生しています。

基本的に何が起こっているかというと、私が新しい 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>
4

2 に答える 2

0

子を作成しないようにするには、PartyRole の PartyRoleType プロパティに null を渡す必要があります。:)

于 2013-07-04T11:28:44.163 に答える