Беглый NHibernate в базу данных SQLite в памяти выдает исключения при вставке с версией - PullRequest
1 голос
/ 05 ноября 2010

У меня довольно большая модель предметной области, которая продолжает использовать беглый NHibernate для MS SQL Server 2008.

Недавно у нас возникли проблемы с параллелизмом, поэтому я реализовал отличную версию NHibernate для версий, рассчитывая на то, чтоиспользуя MSSQL timestamp тип данных.Все мои сущности являются подклассом абстрактного класса с искусным именем DomainEntity, который имеет следующий IAutoMappingOverride:

public class DomainEntityOverride : IAutoMappingOverride<DomainEntity> {
    public void Override(AutoMapping<DomainEntity> mapping) {
        mapping.OptimisticLock.Version();
        mapping.Version(entity => entity.Version);
    }
}

Кроме того, я настроил управление версиями, используя IVersionConvention:

public class VersionConvention : IVersionConvention {
    public void Apply(IVersionInstance instance) {
        instance.Column("Version");
        instance.Generated.Always();
        instance.UnsavedValue("null");
        instance.Not.Nullable();
        instance.CustomSqlType("timestamp");
    }
}

Насколько я понимаю, это должно привести к тому, что Версия будет всегда генерироваться и проверяться на наличие проблем параллелизма.В моей рабочей среде и среде разработки (обе с использованием MSSQL2008) это работает, но мои тесты в памяти, использующие SQLite, больше не работают.

Базовый тест, который сейчас не проходит, следующий:

    [Test(Description = "Can save an aircraft and it is persisted")]
    public void PersistAircraft_NewAircraft_AircraftIsPersisted() {
        var id = saveEntity(_aircraft); //exception thrown here

        var persisted = getEntity<Aircraft>(id);

        Assert.That(persisted.Registration, Is.EqualTo(_aircraftRegistration));
        Assert.That(persisted.Remarks, Is.EqualTo(_aircraftRemark));
    }

Я получаю следующее исключение:

Test 'NOIS.Persistence.Tests.InMemory.AircraftPersistenceTest.PersistAircraft_NewAircraft_AircraftIsPersisted' failed: NHibernate.Exceptions.GenericADOException : could not insert: [NOIS.Model.Entities.AircraftType#9c2809ea-c0c5-4778-838b-9e2500a6d2ef][SQL: INSERT INTO "AircraftType" (ProducedBy, Active, Remarks, Name, Code, Category_id, Id) VALUES (?, ?, ?, ?, ?, ?, ?)]
----> System.Data.SQLite.SQLiteException : Abort due to constraint violation
AircraftType.Version may not be NULL

в NHibernate.Persister.Entity.AbstractEntityPersister.Insert (поля Object id, Object [], Boolean [] notNull, Int32 j, SqlCommandInfo sql, Object obj), Сеанс ISessionImplementor) в NHibernate.Persister.Entity.AbstractEntityPersister.Insert (поля Object id, Object [], Object obj, сеанс ISessionImplementor) в NHibernate.Action.EntityInsertAction.Execute () в NHibernate.Engine.ActionQueue.Execute) в NHibernate.Engine.ActionQueue.ExecuteActions (список IList) в NHibernate.Engine.ActionQueue.ExecuteActions () в NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (сеанс IEventSource) в NHibernate.Event.DlushOFF) в NHibernate.Impl.SessionImpl.Flush () в NHibernate.Transaction.AdoTransaction.Commit () FluentlyConfiguredInMemoryDatabaseTest.cs (49,0): в NOIS.Persistence.Tests.FluentlyConfiguredInMemoryDatabaseTest.saveEntity (сущность DomainEntity) InMemoryT \ NOcs..Persistence.Tests.InMemory.AircraftPersistenceTest.PersistAircraft_NewAircraft_AircraftIsPersisted () --SQLiteException в System.Data.SQLite.SQLite3.Reset (SQLiteStatement stmt) в System.Data.SQLite.SQLite3.Step (элемент SQLiteSitement.Dm.SQLiteDataReader.NextResult () в System.Data.SQLite.SQLiteDataReader..ctor (SQLiteCommand cmd, CommandBehavior ведут себя) в System.Data.SQLite.SQLiteCommand.ExecuteReader (поведение CommandBehavior) в System.Data.SQLite.SQLiteCommand.ExecuteNonNHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery (IDbCommand cmd) в NHibernate.AdoNet.NonBatchingBatcher.AddToBatch (ожидание IExpectation) в NHibernate.Persister.Entity.AbstractEntityPersister.Insert (поля объекта, объект []ean [] notNull, Int32 j, SqlCommandInfo sql, объектный объект, сеанс ISessionImplementor)

1 Ответ

2 голосов
/ 05 ноября 2010

Я не уверен, полностью ли я понимаю, что вы здесь делаете.

Но, насколько я понимаю, вы используете функцию SQL Server, это временные метки, которые недоступны в Sqlite.Так что он там не работает.

Насколько я знаю, временные метки устанавливаются Sql Server при вставке или обновлении записей.Они не находятся под контролем NH.Но NH поддерживает их, с компромиссом, который он должен получить обратно из базы данных после вставки или обновления.Вам нужна веская причина использовать временные метки с NHibernate.

Вам не нужен этот SqlServer, чтобы заставить работать оптимистичный механизм блокировки NH.На самом деле он полностью управляется NH и не требует ничего особенного из базы данных.Просто определите целочисленный столбец и свойство и отобразите его как версию сущностей.Все остальное сделано NH.Мне никогда не приходилось использовать что-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...