实体框架代码优先-DbNull约定
本文关键字:-DbNull 约定 框架 代码 实体 | 更新日期: 2023-09-27 18:21:45
我的问题是我有一个无法修改的现有表,该表包含可为null的字段
我有一个模型,我不想要可为null的属性。
我想做的是有一个约定(我想就是这样),当数据库中遇到DBNull时,我可以根据模型属性类型设置默认值。
- ints/double=0
- string="
- bool=false
很确定这在NHibernate中很简单,但我不知道如何在EF中做到这一点。
我使用的是nuget最新的EF包,我相信是EF 4.2。
您正在寻找的是自定义简单类型映射(或简单类型转换)。这是ORM的一个非常重要的特征,但到目前为止,它在EF中被完全忽略了。目前,DB类型应该与EF模型中的类型匹配,否则可能会出现严重问题,因为您无法在映射中进行任何转换。第一个转换将在EF 5中得到支持,它将只支持将int转换为enum(硬编码转换)。
在EF中,数据库中可以为null的类型=>模型中可以为nullable的类型。
正如alentranks在上面暗示的那样,这可能会使用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;
}