Репозиторий NHibernate для SQLite иногда сохраняет сущность в неправильную таблицу - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть этот репозиторий:

 public class RepositorySQLite : IRepository
    {
        public void Add<T>(T entity)
        {
            using (ISession session = SessionProviderSqLite.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Save(entity);
                transaction.Commit();
            }
        }

      ...
     }

Я использую это так:

public class Entity1: IEntity
{
        public virtual long SomeProperty { get; set; }
}

public class Entity2: IEntity
{
        public virtual long AnotherProperty { get; set; }
}

 IEntity entity = new Entity1();
 entity.SomeProperty = 123;


 IRepository repository = new RepositorySQLite();
             repository.Add(entity);

Отображение сущности:

У каждой сущности есть собственная таблица, которая называется Entity1, Entity2, ... Все в порядке, но иногда Entity1 хранится в таблице Entity2. Мой код работает более чем в одном потоке. Я использую заявление Lock. Nhibernate настраивается с помощью XML. Я использую тест NUnit для всех методов хранилища. Это произошло в моем приложении впервые после одного года нормальной работы.

Возможные решения: я должен использовать session.Save (строка entityName, object entity)? Но как? Как я могу получить entityName?

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Я думаю, что ваша проблема заключается в этом предложении My code is running on more then one thread. Я хотел бы вернуться к этому, поскольку сессии not потокобезопасны. Также см. Это С.О. сообщение для получения дополнительной информации.

Золотое правило: - Make sure that you are not using the same session between different threads.

0 голосов
/ 26 ноября 2011

Это определенно звучит как ошибка в вашем коде.Возможно, что-то есть repository.Add(entity), где entity является ссылкой на неожиданный «EntityX».

Чтобы использовать перегрузку session.Save(string entityName, object entity), попробуйте следующий код:

    public void Add<T>(T entity)
    {
        using (ISession session = SessionProviderSqLite.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.Save(typeof(T).FullName, entity)
            transaction.Commit();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...