我正在使用ValueInjecter将视图模型展平/取消展开为由Entity Framework(4.3.1)模型优先创建的域对象。我数据库中的所有VARCHAR
列都是NOT NULL DEFAULT ''
(个人偏好,不想在这里开启圣战)。在帖子上,视图模型返回任何没有值为null的字符串属性,所以当我尝试将它注入我的域模型类时,EF咆哮我试图用IsNullable=false
来设置属性空值。示例(过于简单):
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
将其切换回null。有没有办法让ValueInjecter不要这样做?
答案 0 :(得分:1)
坚果,我只是在wiki的帮助下弄明白了。解决方案似乎是扩展UnflatLoopValueInjection
:
public class NullStringUnflatLoopValueInjection : UnflatLoopValueInjection<string, string>
{
protected override string SetValue(string sourceValue)
{
return sourceValue ?? string.Empty;
}
}