Кодекс Entity Framework First - Конвенция DbNull - PullRequest
0 голосов
/ 30 января 2012

Моя проблема в том, что у меня есть существующая таблица, которую я не могу изменить, которая содержит поля, которые можно обнулять.

У меня есть модель, которую я не хочу обнулять properties.

То, что я хочу сделать, это иметь соглашение (я предполагаю, что именно так), где я могу установить значение по умолчанию для использования на основе типа свойства моделей, когда встречается DBNullиз базы данных.

  • ints / double = 0
  • string = ""
  • bool = false

Почти уверен, что это былоэто просто сделать в NHibernate, но я не могу понять, как это сделать в EF.

Я использую последний пакет EF от nuget, который, как мне кажется, EF 4.2.

Ответы [ 2 ]

1 голос
/ 30 января 2012

Это невозможно, потому что EF не поддерживает пользовательские соглашения (если вы их не взломали).Более того, даже с условностями это, вероятно, не сработает.

То, что вы ищете, это пользовательское простое сопоставление типов (или простое преобразование типов).Это очень важная особенность ORM, но до сих пор она полностью игнорируется в EF.В настоящее время тип БД должен соответствовать вашему типу в модели EF, иначе у вас могут возникнуть серьезные проблемы, потому что вы не можете выполнять какие-либо преобразования внутри отображения.Первое преобразование будет поддерживаться в EF 5, и оно будет поддерживать только преобразование int в enum (преобразование в жестком коде).

В EF обнуляемый тип в базе данных => обнуляемый тип в вашей модели.

0 голосов
/ 30 января 2012

Как намекает алентранкс выше, это может быть выполнено с использованием некоторой магии со свойствами Nullable<T>.По моему опыту Nullable<T> не обрабатывает DBNull самостоятельно (хотя я могу ошибаться), вы можете использовать трюк, определенный здесь :

private static T NullValue<T>( object testValue, T nullValue )
{
    T returnValue;
    if( testValue is DBNull )
    {
        returnValue = nullValue;
    }
    else if( typeof(T).GetGenericTypeDefinition().Equals( typeof(Nullable<>) ) )
    {
        returnValue = (T)Convert.ChangeType( testValue, Nullable.GetUnderlyingType( typeof(T) ) );
    }
    else
    {
        returnValue = (T)Convert.ChangeType( testValue, typeof(T) );
    }

    return returnValue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...