2010-06-08 6 views
0

У меня проблемы с 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 в любом случае.

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

ответ

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. Но это не очень хорошая идея, поскольку проблема заключается в вашем коде, а не в их. Это не поможет, вы потеряете время.

+0

Спасибо за ваш ответ - там много полезного материала. Однако похоже, что корень проблемы намного проще - кажется, что nHibernate кэширует много материала на веб-сервере, чего я не знал - я предположил, что он каждый раз перестраивал всю свою базовую структуру. Стоп/запуск экземпляра сервера исправил проблему без изменений кода. –

+0

У нас также есть unittest, которые создают базу данных на сервере CI перед запуском унитатов, а другой для развертывания, которые создают базу данных с фиктивными данными для ручного тестирования. Также есть и другая unittest witch, чтобы сообщить нам, соответствует ли база данных сопоставлениям – isuruceanu