Как отлаживать Fluent nHibernate - PullRequest
0 голосов
/ 08 июня 2010

У меня проблемы с 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 Ответ

1 голос
/ 08 июня 2010

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

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

        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");
    }
}

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

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

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

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