实体框架代码第一 - DbNull公约

时间:2012-01-30 02:50:11

标签: c# .net entity-framework-4.1

我的问题是我有一个我无法修改的现有表,其中包含可以为空的字段。

我有一个模型,我不想要可以为空的属性。

我想要做的是有一个约定(我假设这是怎么做),当我从数据库中遇到DBNull时,我可以根据models属性类型设置默认值。< / p>

  • ints / double = 0
  • string =“”
  • bool = false

很确定在NHibernate中这很简单,但我无法在EF中找到如何做到这一点。

我正在使用nuget最新的EF软件包,我相信它是EF 4.2。

2 个答案:

答案 0 :(得分:1)

这是不可能的,因为EF不支持自定义约定(除非您入侵它们)。此外,即使有惯例,它也可能无效。

您正在寻找的是自定义简单类型映射(或简单类型转换)。它是ORM的一个非常重要的特性,但到目前为止它在EF中完全被忽略了。目前DB类型应该与EF模型中的类型匹配,否则您可能会遇到严重问题,因为您无法在映射中进行任何转换。 EF 5支持第一次转换,它只支持将int转换为枚举(硬编码转换)。

在数据库中的EF可空类型=&gt;模型中的可空类型。

答案 1 :(得分:0)

正如alentranks在上面提示的那样,这可能是使用Nullable<T>属性的一些魔法来处理的。根据我的经验Nullable<T>本身不处理DBNull(虽然我可能错了),你可以使用定义的技巧here

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;
}