Fluent nhibernate fluent nhibernate自动映射外键插入null。

Fluent nhibernate fluent nhibernate自动映射外键插入null。,fluent-nhibernate,null,foreign-keys,one-to-many,automapping,Fluent Nhibernate,Null,Foreign Keys,One To Many,Automapping,我有一个班叫工人 public class Worker : BaseEntity { public virtual int WorkerID { get; set; } public virtual string Name { get; set; } public virtual IList<Indemnification> Indemnifications { get; set; } } public class Indemnification :

我有一个班叫工人

 public class Worker : BaseEntity
{
    public virtual int WorkerID { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Indemnification> Indemnifications { get; set; }
}

 public class Indemnification : BaseEntity
{
    public virtual int IndemnificationID { get; set; }
    public virtual string IndemnificationNumber { get; set; }
    //another properties
}
公共类工作程序:BaseEntity
{
公共虚拟整数WorkerID{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList赔偿{get;set;}
}
公共类赔偿:基本实体
{
公共虚拟整数保护ID{get;set;}
公共虚拟字符串保护编号{get;set;}
//其他属性
}
我正在使用一些约定的自动映射

var mappings = new AutoPersistenceModel();
                 mappings.AddEntityAssembly(typeof(Worker).Assembly).Where(GetAutoMappingFilter);
        mappings.Conventions.Setup(GetConventions());
        mappings.Setup(GetSetup());

private Action<IConventionFinder> GetConventions()
    {
        return c =>
        {
            c.Add<PrimaryKeyConvention>();
            c.Add<HasManyConvention>();
            c.Add<TableNameConvention>();
            c.Add<CustomForeignKeyConvention>();
            c.Add<SubClassConvention>();
        };
    }


    public class PrimaryKeyConvention : IIdConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
        {
            instance.Column(instance.EntityType.Name + "ID");
            instance.UnsavedValue("0");
        }
    }

    public class HasManyConvention : IHasManyConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance)
        {
            instance.Key.Column(instance.EntityType.Name + "ID");
            instance.Cascade.AllDeleteOrphan();
        }
    }

    public class TableNameConvention : IClassConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
        {
            instance.Table(instance.EntityType.Name);
        }
    }

    public class CustomForeignKeyConvention : ForeignKeyConvention
    {
        protected override string GetKeyName(Member property, Type type)
        {
            return type.Name + "ID";
        }
    }

    public class SubClassConvention : IJoinedSubclassConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IJoinedSubclassInstance instance)
        {
            instance.Table(instance.EntityType.Name);
            instance.Key.Column(instance.EntityType.BaseType.Name + "ID");
        }

    }
var mappings=new AutoPersistenceModel();
AddEntityAssembly(typeof(Worker.Assembly).Where(GetAutoMappingFilter);
mappings.Conventions.Setup(GetConventions());
mappings.Setup(GetSetup());
私人行动
{
返回c=>
{
c、 添加();
c、 添加();
c、 添加();
c、 添加();
c、 添加();
};
}
公共类PrimaryKeyConvention:IIdConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance实例)
{
列(instance.EntityType.Name+“ID”);
实例。未保存的值(“0”);
}
}
公共类有许多约定:IHasManyConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance实例)
{
instance.Key.Column(instance.EntityType.Name+“ID”);
Cascade.AllDeleteOrphan();
}
}
公共类TableNameConvention:IClassConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance实例)
{
表(instance.EntityType.Name);
}
}
公共类CustomForeignKeyConvention:ForeignKeyConvention
{
受保护的重写字符串GetKeyName(成员属性,类型)
{
返回类型。名称+ID;
}
}
公共类子条款:ijoined子条款
{
public void Apply(FluentNHibernate.Conventions.Instances.ijoined子类实例)
{
表(instance.EntityType.Name);
instance.Key.Column(instance.EntityType.BaseType.Name+“ID”);
}
}
问题在于,当我用一份赔偿清单拯救工人时: 工人被保存,因此除了外键(WorkerID)之外的赔偿也被保存
赔偿表为空???

我解决了问题:

当需要保存具有(一对多)关系的实体时,需要打开事务并提交:)


您是否想知道为什么自动映射首先允许为一对多关系创建的外键为空

那么在您的示例中,为什么表“赔偿”中的列“workerId”没有添加NOTNULL约束呢


我刚刚遇到了这个问题,我认为即使它可以在代码中处理,也不可能插入空值,对吗?有什么解决办法吗

不幸的是,我无法找到解决方案,更糟糕的是,我试图手动将赔偿表中的外键列设置为非null,结果出现了一个异常。
Session.BeginTransaction();
Session.Save(entity);
Session.CommitTransaction();