流利的nhibernate问题

时间:2010-08-20 15:59:00

标签: fluent-nhibernate

我写了这样的代码

 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");
       }


}

这是配置

 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();

这是删除代码

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

        }

我的问题:当我想要删除一个孩子它的消息
“非法尝试与两个开放会议相关联”

请帮帮我

1 个答案:

答案 0 :(得分:1)

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

您有两个或更多个开放会话,并且您尝试将某个实体与多个实体关联。

更新

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

这里有一些问题:

  1. 您应该只创建一次会话工厂。永远。这是一项昂贵的操作。
  2. 您正在将实体传递给Delete()方法。这个实体来自哪里?您已经使用不同的ISession清楚地将其加载到应用程序的其他位置。这是问题的症结所在。除非您Evict()来自第一个ISession(不推荐)的实体,否则尝试使用不同的ISession操纵它将会抛出。
  3. 您正在调用Flush(),这几乎不会被使用。
  4. 您正在使用隐式交易。
  5. 您应该删除与加载它的ISession相同的实体,并且您应该在事务中执行工作,如下所示:

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