2012-05-08 2 views
2

Я использую ValueInjecter для моделирования сглаживания/unflatten в объектах домена, созданных с помощью Entity Framework (4.3.1). Все мои VARCHAR столбцов в моей базе данных: NOT NULL DEFAULT '' (личное предпочтение, нет желания открыть здесь священную войну). В столбце модель представления возвращается с любым строковым свойством, которое не имеет значения как null, поэтому, когда я пытаюсь вставить его обратно в класс модели домена, EF лает на меня, пытаясь установить свойство с IsNullable=false на null. Пример (более простой):Изменение нулевых строк на string.Empty с использованием ValueInjecter

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 или DB-First, вы используете пользовательский T4? Если это так или вы используете Code-First, то вы можете добавить нулевую проверку в настройках свойств. –

+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; 
    } 
} 
Смежные вопросы