ValueInjecterを使用して、ビューモデルをEntity Framework(4.3.1)モデルで最初に作成されたドメインオブジェクトに展開/非平坦化しています。私のデータベースにある私のVARCHAR
のすべての列はNOT NULL DEFAULT ''
(個人的な好みで、ここで聖戦を開く願望はありません)です。ポストでは、ビューモデルはヌルとして値を持たない任意の文字列プロパティで返されます。したがって、ドメインモデルクラスに戻してみると、EFはIsNullable=false
でプロパティをnullに設定しようとしたことを私に告げる。 (オーバーシンプル)例:ValueInjecterを使用してヌル文字列をstring.Emptyに変更します。
public class ThingViewModel
{
public int ThingId{get;set;}
public string Name{get;set;}
}
public class Thing
{
public global::System.Int32 ThingId
{
//omitted for brevity
}
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String Name
{
//omitted for brevity
}
}
その後、私のコントローラポストは次のようになります。
[HttpPost]
public ActionResult Edit(ThingViewModel thing)
{
var dbThing = _thingRepo.GetThing(thing.ThingId);
//if thing.Name is null, this bombs
dbThing.InjectFrom<UnflatLoopValueInjection>(thing);
_thingRepo.Save();
return View(thing);
}
私はThing
の実際のドメイン版で種類が入れ子になってきたので、私はUnflatLoopValueInjection
を使用しています。 null文字列をstring.Empty
に変換するカスタムConventionInjection
を作成しようとしましたが、UnflatLoopValueInjection
がnullに戻ってしまうようです。 ValueInjecterにこれを行わない方法がありますか?
モデルファーストまたはコードファースト? Model-FirstまたはDB-Firstの場合、カスタムT4を使用していますか?もしそうなら、Code-Firstを使用している場合は、プロパティのセッターにヌルチェックを追加することができます。 –
@DannyVarodモデル - まず、質問に記載されているように、カスタムT4を使用しません。私は 'TargetProp'の属性を反映しようとしましたが、これではそれほど大きくはありませんでした。 –
いくつかの人々は2つを混乱させる。デフォルトのジェネレータT4sを使用している場合、エンティティは基本クラスを持つ必要があります。 –