使用ValueInjecter将空字符串更改为string.Empty

时间:2012-05-08 16:55:03

标签: asp.net-mvc entity-framework valueinjecter

我正在使用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不要这样做?

1 个答案:

答案 0 :(得分:1)

坚果,我只是在wiki的帮助下弄明白了。解决方案似乎是扩展UnflatLoopValueInjection

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