Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同一表中的父/子项中是否存在Fluent Nhibernate异常?_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 同一表中的父/子项中是否存在Fluent Nhibernate异常?

C# 同一表中的父/子项中是否存在Fluent Nhibernate异常?,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我发现在保存时发生以下错误: “对象引用未保存的临时实例-在刷新之前保存临时实例,或将属性的级联操作设置为使其自动保存的内容。” 实体: public class Division : EntityBase<int> { public Division() : base() { DivisionType = new DivisionType(); Employees = new List<Employee>(

我发现在保存时发生以下错误:
“对象引用未保存的临时实例-在刷新之前保存临时实例,或将属性的级联操作设置为使其自动保存的内容。”
实体:

public class Division : EntityBase<int>
{
    public Division()
        : base()
    {
        DivisionType = new DivisionType();
        Employees = new List<Employee>();
        DivisionChildren = new List<Division>();
    }

    public virtual string DivisionName { get; set; }
    public virtual DivisionType DivisionType { get; set; }
    public virtual Division ParentDivision { get; set; }
    public virtual IList<Division> DivisionChildren { get; set; }
    public virtual IList<Employee> Employees { get; set; }
}
出现上述错误异常!!

问题在哪里?

在构造函数中-创建了新的实例
DivisionType

 DivisionType = new DivisionType();
映射无论如何都不会处理其级联:

References(x => x.DivisionType).Column("DivisionTypeId");
这就是例外的原因。如果要重新创建类型。。。您也可以引入级联。但最重要的是你应该把它绑起来。。从现有类型的列表

因此,并非首选的解决方案(仅在我看来)不会是:

References(x => x.DivisionType)
    .Column("DivisionTypeId");
    .Cascade.All();
但它会起作用

我建议的方法是获取对现有DivisionType的引用并分配它

entity.DivisionType = Session.Load<DivisionType>(typeId); // recieved from client
Session.SaveOrUpdate(entity);
NhUnitOfWork.Current.Commit();
如果会话不是服务(MVC控制器)层的一部分,我们可以创建一些DAO方法,例如:

public virtual Division GetById(id)
{
    var session = ... // ISessionFactory gets session
    return session.Get<Division>(id);
}
公共虚拟分区GetById(id)
{
var session=…//ISessionFactory获取会话
返回会话.Get(id);
}
这在与NHibernate合作时非常重要。如果我们希望NHibernate完成所有的级联,那么引用应该通过NHibernate(Get或Load)

请务必阅读以下深刻的解释:


我认为这不是问题所在。因为当我在ParentDivisionId中输入一个值时,不会发生错误,但是当ParentDivisionId等于零时,实体被成功保存。但是,我尝试了你的剪接代码,但没有成功。异常在上面的问题中。这是完整的错误异常:对象引用未保存的临时实例-在刷新之前保存临时实例,或将属性的级联操作设置为使其自动保存的内容。类型:HR.Core.Data.Entities.Division,Entity:HR.Core.Data.Entities.Division“没有内部例外我真的很想帮你。但我需要更多信息。1)看,你显示的映射显示:
引用(x=>x.DivisionType)
。这意味着,该除法类型将作为
DivisionTypeId
保存到除法表中。2)如果NHibernates试图保存您的实体,它引用了构造函数中创建的DivisionType。3)此临时实例-此DivisionType属性导致异常。请您理解我,我在尝试什么我几乎可以肯定,这就是问题所在。因为其他映射是正确的。属性ParentDivision including我知道你的意思,但你给我的代码不起作用:
引用(x=>x.DivisionType).Column(“DivisionTypeId”);.Inverse().Cascade.All();
你确定这段代码有效吗?.Because.Inverse()甚至不存在于引用中(多同一关系)。
entity.DivisionType = Session.Load<DivisionType>(typeId); // recieved from client
Session.SaveOrUpdate(entity);
NhUnitOfWork.Current.Commit();
entity.ParentDivision = session.Load<Division>(parentDivisionId);
public virtual Division GetById(id)
{
    var session = ... // ISessionFactory gets session
    return session.Get<Division>(id);
}