2012-05-08 52 views
2

我使用ValueInjecter將視圖模型平鋪/解開爲由實體框架(4.3.1)模型優先創建的域對象。我的數據庫中的所有VARCHAR列都是NOT NULL DEFAULT ''(個人偏好,不希望在此打開聖戰)。在發佈後,視圖模型會返回任何沒有值爲null的字符串屬性,因此當我嘗試將其注入到域模型類中時,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); 
} 

我使用UnflatLoopValueInjection,因爲我已經嵌套的Thing實際域版本類型。我試圖編寫一個自定義ConventionInjection來將空字符串轉換爲string.Empty,但似乎UnflatLoopValueInjection將其切換回空。有沒有辦法讓ValueInjecter不這樣做?

+0

Model-First or Code-First?如果Model-First或DB-First,您是否使用自定義T4?如果是這樣或者你正在使用Code-First,那麼你可以在屬性的setter中添加一個空檢查。 –

+0

@DannyVarod模型 - 第一,如問題所述,不使用自定義T4。我試圖反映「TargetProp」的屬性,並沒有太大的瞭解。 –

+0

有些人把兩者混爲一談。如果你使用默認的生成器T4,那麼你的實體應該有一個基類。 –

回答

1

堅果,我只是在wiki的幫助下計算出來的。該解決方案似乎要延長UnflatLoopValueInjection

public class NullStringUnflatLoopValueInjection : UnflatLoopValueInjection<string, string> 
{ 
    protected override string SetValue(string sourceValue) 
    { 
     return sourceValue ?? string.Empty; 
    } 
}