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不這樣做?
Model-First or Code-First?如果Model-First或DB-First,您是否使用自定義T4?如果是這樣或者你正在使用Code-First,那麼你可以在屬性的setter中添加一個空檢查。 –
@DannyVarod模型 - 第一,如問題所述,不使用自定義T4。我試圖反映「TargetProp」的屬性,並沒有太大的瞭解。 –
有些人把兩者混爲一談。如果你使用默認的生成器T4,那麼你的實體應該有一個基類。 –