Как отлаживать Fluent nHibernate

У меня проблемы с Fluent nHibernate. Я добавил столбец в таблицу и подумал, что правильно изменил сопоставления и связанные объекты данных, чтобы правильно отразить это. Однако, когда я попытался снова запустить свое приложение, я продолжал получать эту ошибку:

System.Data.SqlClient.SqlException: Invalid column name 'Workflow_id'.

Я действительно не мог понять, в чем проблема с изменениями, которые я сделал, поэтому я вернулся к исходным версиям файлов сопоставления и объектов данных из системы управления версиями и удалил столбец-нарушитель из базы данных. Но я все еще получаю ту же ошибку.

Я хотел бы получить несколько советов о том, как отладить это. SQL-код, который сообщается об ошибке, наполовину бессмысленен:

SELECT regions0_.Page_id as Page5_1_, regions0_.Id as Id1_, regions0_.Id as Id27_0_, regions0_.RegionId as RegionId27_0_, regions0_.RegionTemplate_id as RegionTe3_27_0_, regions0_.Workflow_id as Workflow4_27_0_ FROM [Region] regions0_ WHERE regions0_.Page_id=?

И в любом случае он не будет выполняться как действительный SQL.

Любые идеи относительно того, куда идти отсюда?


person Bob Tway    schedule 08.06.2010    source источник


Ответы (1)


Я думаю, вам не нужно отлаживать FluentNhibernate. Проблема может быть в ваших условностях.

Как я понимаю у вас есть объект Region и он ссылается на другой объект Workflow. Поэтому установите соглашение для всех ссылок, например:

        private  Action<IConventionFinder> GetConventions() 
        {
            return c =>
                { 
                    c.Add<PrimaryKeyConvention>();
                    c.Add<ReferenceConvention>();
                    c.Add<HasManyConvention>();
                    c.Add<TableNameConvention>();
                    c.Add<PropertyNameConvention>();
                };
        }

Используйте этот закрытый метод в своей реализации

 public AutoPersistenceModel Generate()

И справочное соглашение должно быть примерно таким:

using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.Instances;

public class ReferenceConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        instance.Column(Inflector.Net.Inflector.Camelize(instance.Property.Name) + "Id");
    }
}

Также убедитесь, что вы переопределяете сопоставления, если это так.

У меня есть unittest, экспортирующий сопоставления. К сожалению, ниже приведена старая версия:

[Test, Ignore("Run this test only if you want to see mappings")]
    public void ShouldExportMappings()
    {
        const string mappingPath = @"mappings";

        if (!Directory.Exists(mappingPath))
            Directory.CreateDirectory(mappingPath);

        var sessionFactory = Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.InMemory)
            .Mappings(m =>
                          {
                              m.FluentMappings
                                  .AddFromAssemblyOf<User>()
                                  .ExportTo(mappingPath);

                              m.AutoMappings
                                  .Add(new AutoPersistenceModelGenerator().Generate())
                                  .ExportTo(mappingPath);
                          }).BuildSessionFactory();
    } 

И, наконец, если вы действительно хотите отладить, скопируйте исходники FluentNHibernate из их хранилища и включите их в свой sln. Но это не очень хорошая идея, так как проблема в вашем коде, а не в их. Это не поможет, вы только потеряете время.

person isuruceanu    schedule 08.06.2010
comment
Спасибо за ответ - там много полезного. Однако похоже, что корень проблемы намного проще - кажется, что nHibernate кэширует много вещей на веб-сервере, чего я не знал - я предполагал, что он каждый раз перестраивает всю свою базовую структуру. Остановка/запуск экземпляра сервера устранила проблему без изменений кода. - person Bob Tway; 08.06.2010
comment
У нас также есть unittest, который создает базу данных на сервере CI перед запуском unitests, другой для развертывания, который создает базу данных с фиктивными данными для ручного тестирования. Также попросите других юниттестов сообщить нам, соответствует ли база данных сопоставлениям. - person isuruceanu; 08.06.2010