实体框架代码优先-DbNull约定

本文关键字:-DbNull 约定 框架 代码 实体 | 更新日期: 2023-09-27 18:21:45

我的问题是我有一个无法修改的现有表,该表包含可为null的字段

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

我想做的是有一个约定(我想就是这样),当数据库中遇到DBNull时,我可以根据模型属性类型设置默认值

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

很确定这在NHibernate中很简单,但我不知道如何在EF中做到这一点。

我使用的是nuget最新的EF包,我相信是EF 4.2。

实体框架代码优先-DbNull约定

这是不可能的,因为EF不支持自定义约定(除非你破解它们)。此外,即使有惯例,它也可能不起作用。

您正在寻找的是自定义简单类型映射(或简单类型转换)。这是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;
}