Fluent nhibernate Fluent nhibernate的问题

Fluent nhibernate Fluent nhibernate的问题,fluent-nhibernate,Fluent Nhibernate,我已经写了这样的代码 public class person { public person() { public virtual int Id { get; set; } public virtual string Code { get; set; } } } public class Child : P

我已经写了这样的代码

 public class person
        {
            public person()
            {
                 public virtual int Id { get; set; }
                 public virtual string Code { get; set; }
            } 
        }
        public class Child : Person
        {
            public person()
            {
                 public virtual string Name{ get; set; }
                 public virtual string Lastname{ get; set; }
            } 
        }
        public class Book
       {
           public virtual int Id { get; set; }
           public virtual string Name {get;set;}

       }
我的Mapper类是这样的

   public class PersonMapping : ClassMap<Person>
   {
            public PersonMapping()
            {
                Table("tblPersons");
                Id(x => x.Id).GeneratedBy.Native();
                Map(p => p.Code);

                JoinedSubClass<Child>("Id", MapChild);
            }

            public static void MapChild(JoinedSubClassPart<Child> child)
            {
                child.Table("tblChilds");
                child.Map(p => p.Name);
                child.Map(p => p.Lastname);
                child.HasMany(x => x.Relatives);
              }

    }
    public class RelativeMapping : ClassMap<Relative>
    {

       public RelativeMapping()
       {
          Table("tblRelatives");
          Id(x => x.Id);
          Map(p => p.Name);
          References(x => x.Child).Column("ChildId");
       }


}
公共类PersonMapping:ClassMap
{
公众人物地图
{
表(“tblPersons”);
Id(x=>x.Id).GeneratedBy.Native();
Map(p=>p.Code);
JoinedSubClass(“Id”,MapChild);
}
公共静态void映射子类(JoinedSubclass部分子类)
{
儿童表(“tblChilds”);
Map(p=>p.Name);
Map(p=>p.Lastname);
child.HasMany(x=>x.亲戚);
}
}
公共类相对映射:类映射
{
公共相对映射()
{
表(“TBL相关”);
Id(x=>x.Id);
Map(p=>p.Name);
引用(x=>x.Child).Column(“ChildId”);
}
}
这是配置

 Assembly assm = Assembly.Load("BLL");
                return   Fluently.Configure()
                        .Database(MsSqlConfiguration.MsSql2008
                        .ConnectionString(c => c
                        .FromAppSetting("ConnStr"))
                        .Cache(c => c
                        .UseQueryCache()
                        .ProviderClass<HashtableCacheProvider>())
                        .ShowSql())
                        .Mappings(m => m.FluentMappings.AddFromAssembly(assm))
                        .BuildSessionFactory();
Assembly=Assembly.Load(“BLL”);
流畅地返回。Configure()
.数据库(MsSqlConfiguration.MsSql2008
.ConnectionString(c=>c
.FromAppSetting(“ConnStr”))
.Cache(c=>c
.UseQueryCache()
.ProviderClass())
.ShowSql())
.Mappings(m=>m.FluentMappings.AddFromAssembly(assm))
.BuildSessionFactory();
这是删除的代码

 public void Delete<T>(T obj)
        {
            ISessionFactory fact = FluentConfiguration.CreateSessionFactory();
            ISession session = fact.OpenSession();
            session.Delete(obj);
            session.Flush();

        }
public void Delete(T obj)
{
ISessionFactory事实=FluentConfiguration.CreateSessionFactory();
ISession session=fact.OpenSession();
删除(obj);
session.Flush();
}
我的问题:当我想删除一个孩子的信息时
“非法尝试与两个打开的会话关联”


请帮助我

错误告诉您问题所在,而不是您的实体或映射

您有两个或多个打开的会话,并且您正试图将某个实体与其中的多个会话关联

更新 作为对更新代码的响应,我看到您有一个方法,该方法接受一个实体作为参数,创建一个新的会话工厂,创建一个新会话,然后尝试删除该实体

这里有一些问题:

  • 您应该只创建一次会话工厂。曾经这是一项昂贵的手术
  • 您正在将实体传递给
    Delete()
    方法。这个实体来自哪里?显然,您已经在应用程序的其他地方加载了它,使用了不同的
    ISession
    。这是问题的症结所在。除非您从第一个
    ISession
    (不推荐)中退出()实体,否则尝试使用不同的
    ISession
    操作它将抛出
  • 您正在调用
    Flush()
    ,几乎不应该使用它
  • 您正在使用隐式事务
  • 您确实应该删除与加载该实体的会话相同的
    ISession
    ,并且您应该在事务中执行工作,如下所示:

    using(var transaction = session.BeginTransaction())
    {
        session.Delete(obj);
        transaction.Commit();
    }
    

    您好,谢谢使用答案,但当我想添加一个新的子项时,它没有这个问题,只是在删除一个子项时它有这个问题,我该怎么办?@ushuah潜在的回答者需要查看相关代码以帮助您--您创建会话的代码并删除子实体。谢谢这真的帮了我的忙