我想将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");
}
}
但是这个和其他方法不起作用。请帮帮我。
答案 0 :(得分:1)
该示例使用用户类型。它需要在某个地方实施。
默认情况下,布尔值存储在数字列中。来自Oracle8iDialect.cs(此行由9i和10i派生):
RegisterColumnType(DbType.Boolean, "NUMBER(1,0)");
默认情况下,您需要在数据库中使用这样的数字列,然后您可以在没有特殊类型配置的情况下映射它:
Map(department => department.IsActive).Not.Nullable().Column("IS_ACTIVE");
如果要在数据库中使用其他类型,可以指定SQL类型或自己的用户类型。
使映射和数据库模式一致的最简单方法是使用NHibernate模式生成器从映射生成模式。如果您不希望完全自动创建架构,则只能创建SQL创建表脚本以供查看。