エンティティの例があるとします。
public class City
{
public int CityId { get; set; }
public string Name { get; set; }
public int StateId { get; set; }
public virtual State State{ get; set; }
}
新しい都市が作成される状況がいくつかあります。1) ビュー内のユーザーによって、既存の状態から選択:
@Html.DropDownListFor(it => it.StateId, ViewBag.States)
2) 状態が新しい可能性がある状況でのバックエンド:
State newState = context.States.Create();
newState.Name = "North Takoma";
City newCity = context.Cities.Create();
newCity.Name = "Springfield";
newCity.State = newState;
context.States.Attach(newState);
context.Cities.Attach(newCity);
context.SaveChanges();
状態の関係は必須であり、検証する必要があります。問題は、StateID または実際の State リレーションシップ オブジェクトで検証する必要があるかどうかです。(ここでは FluentValidation を使用していますが、データ注釈を使用した場合とかなり似た状況になります)
public class CityValidator : AbstractValidator<City>
{
public CityValidator()
{
// this?
RuleFor(it => it.StateID).NotEmpty();
// or this?
RuleFor(it => it.State).NotNull();
}
}
最初の状況では、StateID は取り込まれますが、状態オブジェクトは取り込まれません。2 番目の状況ではその逆です。
バリデーターにカスタム ロジックを配置して、どちらかをチェックすることができます。ただし、ビューで目立たない検証属性が失われます。この問題に対する適切な DRY ソリューションはありますか?
明確化のために編集:この例では、StateID (既存の州の場合) または State プロパティ (新しい州の場合) を設定することで、State を City に割り当てることができます。では、どうすれば検証を設定し、ビューの入力で「data-val-required」属性を取得できますか?