代码之家  ›  专栏  ›  技术社区  ›  Elvin Mammadov

Fluent NHibernate:将布尔属性映射到ORACLE数据库

  •  2
  • Elvin Mammadov  · 技术社区  · 9 年前

    我想将bool c#属性映射到Oracle DB。为此我尝试了几种方法。但没有奏效。网上并没有最佳解决方案的例子。 我的实体如下:

     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 流畅的映射示例:

    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 回复  |  直到 9 年前
        1
  •  2
  •   quetzalcoatl    7 年前

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

    默认情况下,布尔值存储在数字列中。来自Oracle8iDialect。cs(该线由9i和10i导出):

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

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

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

    如果希望数据库中有其他类型,可以指定SQL类型或自己的用户类型。

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