データベースに 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>