我的问题是我有一个我无法修改的现有表,其中包含可以为空的字段。
我有一个模型,我不想要可以为空的属性。
我想要做的是有一个约定(我假设这是怎么做),当我从数据库中遇到DBNull时,我可以根据models属性类型设置默认值。< / p>
很确定在NHibernate中这很简单,但我无法在EF中找到如何做到这一点。
我正在使用nuget最新的EF软件包,我相信它是EF 4.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;
}