流畅的NHibernate:将Bool属性映射到ORACLE DB

时间:2016-03-10 06:51:34

标签: c# oracle nhibernate fluent-nhibernate

我想将bool c#属性映射到Oracle DB。我尝试了几种方法。但是没有用。 Web上没有最佳解决方案的示例。 我的实体如下:

 public class Department : EntityBase<short>
{
    [JsonIncludeProperty(NameOfSet = "list")]
    public virtual string Name { get; set; }

    public virtual  Department ParentDepartment { get; set; }
    public virtual IList<Department> ChildDepartments { get; set; }
    // Bool value
    public virtual bool IsActive { get; set; }
}

来自this Fluent映射示例:

public class DepartmentMap : ClassMap<Department>
{
    public DepartmentMap()
    {
        Table("DEPARTMENTS");
        LazyLoad();
        Id(x => x.Id)
            .GeneratedBy.Sequence("DEPARTMENTS_SEQ")
            .Not.Nullable()
            .Column("DEPARTMENT_ID")
            .CustomSqlType("NUMBER(5,0)");
        Map(x => x.Name).Not.Nullable().Column("DEPARTMENT_NAME").CustomSqlType("NVARCHAR2(100)");

        Map(department => department.IsActive).Not.Nullable().Column("IS_ACTIVE").CustomType<YesNoType>();

        HasMany(x => x.ChildDepartments)
            .AsList()
            .Inverse()
            .Cascade.All()
            .KeyColumn("PARENT_DEPARTMENT_ID");

        References(x => x.ParentDepartment, "PARENT_DEPARTMENT_ID");
    }
}

但是这个和其他方法不起作用。请帮帮我。

1 个答案:

答案 0 :(得分:1)

该示例使用用户类型。它需要在某个地方实施。

默认情况下,布尔值存储在数字列中。来自Oracle8iDialect.cs(此行由9i和10i派生):

RegisterColumnType(DbType.Boolean, "NUMBER(1,0)");

默认情况下,您需要在数据库中使用这样的数字列,然后您可以在没有特殊类型配置的情况下映射它:

  Map(department => department.IsActive).Not.Nullable().Column("IS_ACTIVE");

如果要在数据库中使用其他类型,可以指定SQL类型或自己的用户类型。

使映射和数据库模式一致的最简单方法是使用NHibernate模式生成器从映射生成模式。如果您不希望完全自动创建架构,则只能创建SQL创建表脚本以供查看。