Проблема с беглым nhibernate - PullRequest
0 голосов
/ 20 августа 2010

Я написал такой код

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

        }

моя проблема: когда я хочу удалить Child it сообщения
"НЕЗАКОННАЯ ПОПЫТКА ОБЪЕДИНЯТЬСЯ С ДВА ОТКРЫТОЙ СЕССИИ"

пожалуйста, помогите мне

1 Ответ

1 голос
/ 20 августа 2010

Ошибка говорит вам о проблеме, и это не относится к вашим сущностям или вашему отображению.

У вас есть два или более открытых сеансов, и вы пытаетесь связать некоторый объект с более чем одним из них.

update

В ответ на обновленный код я вижу, что у вас есть метод, который принимает сущность в качестве параметра, создает новую фабрику сеансов, создает новый сеанс, а затем пытаетсяудалите сущность.

Здесь есть некоторые проблемы:

  1. Фабрику сеанса следует создавать только один раз.Когда-либо.Это дорогостоящая операция.
  2. Вы передаете сущность методу Delete().Откуда эта сущность?Вы явно уже загрузили его в другое место вашего приложения, используя другой ISession.В этом суть проблемы.Если вы не Evict() сущность из первого ISession (не рекомендуется), попытка манипулировать им с помощью другого ISession броска.
  3. Вы звоните Flush(), который почти никогда не должен использоваться.
  4. Вы используете неявную транзакцию.

Вы действительно должны удалить объект с тем же ISession, с которым он был загружен, и вы должны выполнять работу в пределахтранзакция, как это:

using(var transaction = session.BeginTransaction())
{
    session.Delete(obj);
    transaction.Commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...