NHibernate FluentMapping

时间:2016-02-29 06:35:28

标签: c# nhibernate fluent-nhibernate

我有以下流畅的映射类。对象位置上的Component(property)类型设置为Default of empty string而不是nullable。插入时,我得到一个异常,说我需要指定Type(不可为空),它是否应该使用指定的默认值?

public class LocationMapping : FluentNHibernate.Mapping.ClassMap<Cradle.DomainEntities.Location>
    {
        public LocationMapping()
        {
            Id(x => x.ID);
            Map(x => x.Barcode).CustomSqlType("varchar(30)").Unique().Not.Nullable();
            Map(x => x.Name).CustomSqlType("varchar(30)").Not.Nullable();
            Map(x => x.Site).CustomSqlType("varchar(30)").Not.Nullable().Default("");
            Map(x => x.ERPLocation).CustomSqlType("varchar(15)").Not.Nullable().Default("");
            Component<Cradle.DomainEntities.Status>(x => x.Status, c => { c.Map(x => x.Name, "Status").CustomSqlType("varchar(20)"); });
            Component<Cradle.DomainEntities.Type>(x => x.Type, c => { c.Map(x => x.Name, "Type").CustomSqlType("varchar(20)").Default("").Not.Nullable(); });
            Component<Cradle.DomainEntities.Category>(x => x.Category, c => { c.Map(x => x.Name, "Category").CustomSqlType("varchar(20)"); });
            Map(x => x.isActive).Not.Nullable().Default("1");
            Map(x => x.NonStock).Not.Nullable().Default("0");
        }
    }

Component<Cradle.DomainEntities.Type>(x => x.Type, c => { c.Map(x => x.Name, "Type").CustomSqlType("varchar(20)").Default("").Not.Nullable(); });

1 个答案:

答案 0 :(得分:2)

在映射中定义switch不会改变.Net默认值。

当您实例化goto类时,我猜您的Default属性未初始化(没有初始化值或构造函数未设置它),因此其字符串的默认.Net值为:{{ 1}}。

NHibernate不会用您声明的Location替换Type。怎么可能猜到它不甘心被设置为空?

您应该在类定义中使用默认值初始化类属性。

尽管如此,仍然可以使用某种解决方法。对于null属性和其他可空属性,您可以在类上使用null选项,因为它会导致NHibernate不向DB发送null属性。

See the doc:

  

(8)dynamic-insert(可选,默认为false):指定   INSERT SQL应该在运行时生成,并且只包含列   其值不为空。

当然,它不适用于具有非可空类型的属性。

那么,在映射中定义默认值的官方支持目的是什么?我只知道一个:从映射生成数据库模式,以生成列的默认约束。

我们可能会认为Default选项应考虑这些默认值。但如果是这种情况(也许是这样的话,NHibernate doc有时会落后于实现的功能),那将导致我建议的解决方法&#39;失败,因为dynamic-insert的行为应该是只包含其值等于它们在映射中声明的默认值的列,如果它们没有声明的默认值,则为null。