2012-05-08 2 views
2

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にこれを行わない方法がありますか?

+0

モデルファーストまたはコードファースト? Model-FirstまたはDB-Firstの場合、カスタムT4を使用していますか?もしそうなら、Code-Firstを使用している場合は、プロパティのセッターにヌルチェックを追加することができます。 –

+0

@DannyVarodモデル - まず、質問に記載されているように、カスタムT4を使用しません。私は 'TargetProp'の属性を反映しようとしましたが、これではそれほど大きくはありませんでした。 –

+0

いくつかの人々は2つを混乱させる。デフォルトのジェネレータT4sを使用している場合、エンティティは基本クラスを持つ必要があります。 –

答えて

1

ナッツ、私はちょうどwikiの助けを借りてそれを考え出しました。解は延長するように見えるUnflatLoopValueInjection

public class NullStringUnflatLoopValueInjection : UnflatLoopValueInjection<string, string> 
{ 
    protected override string SetValue(string sourceValue) 
    { 
     return sourceValue ?? string.Empty; 
    } 
} 
関連する問題