Тестирование спецификации сохраняемости с помощью гибких сопоставлений nhibernate

#c# #nhibernate #fluent-nhibernate #foreign-keys

#c# #nhibernate #свободно-nhibernate #внешние ключи

Вопрос:

Недавно я поиграл с fluent nhibernate и, в частности, с тестированием спецификации сохраняемости.

Тем не менее, я продолжаю сталкиваться с ошибкой sql lite при выполнении относительно простого теста с помощью nunit при построении схемы для теста в этой строке: (SessionSource .buildSchema(сессия)).

System.Data.SQLite.Исключение SQLiteException: ошибка SQLite рядом с «/»: синтаксическая ошибка

Ищу некоторые рекомендации относительно того, что я делаю неправильно, поскольку я относительно новичок в fluent. Есть ли более простой способ устранения неполадок с этим сообщением об ошибке?

 public class Contact
{
    public int Id { get; protected set; }
    // some other properties 
    public IList<Note> Notes { get; set; }
}

public ContactMapping()
{
    Not.LazyLoad();
    Id(m => m.Id).GeneratedBy.Identity();
    HasMany(x => x.Notes).KeyColumns.Add("ContactId");
}

public class Note
{
    public int Id { get; protected set; }
    public Contact Contact { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

public NoteMapping()
{
    Not.LazyLoad();
    Id(m => m.Id).GeneratedBy.Identity();
    Map(m => m.Title).Not.Nullable().Length(250);
    Map(m => m.Description).Not.Nullable().Length(2500);
    References(x => x.Contact).Column("ContactId").Cascade.All();
}
  

Конфигурация:

 public void SetupContext()
{
    var cfg = Fluently.Configure()
        .Database(SQLiteConfiguration.Standard
            .ShowSql()
            .InMemory
            );
    SessionSource = new SessionSource(cfg.BuildConfiguration()
                                            .Properties, PersistenceModel());
    Session = SessionSource.CreateSession();
    SessionSource.BuildSchema(Session);
}

private static PersistenceModel PersistenceModel()
{
    var model = new PersistenceModel();
    model.AddMappingsFromAssembly(typeof(Contact).Assembly);
    return model;
}
  

И, наконец, тест на постоянство:

 new PersistenceSpecification<Contact>(Session)
    .CheckProperty(c => c.Id, 1)
    .CheckProperty(c => c.First, "Coding")
    .CheckProperty(c => c.Last, "Quiz")
    .CheckProperty(c => c.Email, "mail@test.com")
    .CheckReference(c => c.Notes, new Note { Title = "Title", Description = "Description" })
    .VerifyTheMappings();
  

Ответ №1:

Вы должны использовать CheckList в PersistanceSpecification классе, а CheckReference не в приведенном выше коде.

Комментарии:

1. Спасибо, Коул, буду иметь это в виду. Однако моя проблема заключается в том, что генерация схемы, по-видимому, по какой-то причине не выполняется до выполнения теста действия в этой строке: SessionSource . buildSchema(сессия)

Ответ №2:

Ну, я чувствую себя немного глупо. Одним из столбцов, которые я исключил из своего первоначального сообщения, было поле DateTime, в котором было установлено неверное значение по умолчанию, которое, в свою очередь, генерировало недопустимый sql при построении схемы.

Вывод конфигурации таблицы при построении схемы выявил мою ошибку.