0

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 として実行されません。

ここからどこへ行くべきかについてのアイデアはありますか?

4

1 に答える 1

1

FluentNhibernate をデバッグする必要はないと思います。問題はあなたの慣習にある可能性があります。

私が理解しているように、オブジェクト Region があり、他のオブジェクト Workflow に参照されています。したがって、すべての参照リンク eq の規則を設定します。

        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 に含めます。しかし、問題はコードではなくコードにあるため、これは良い考えではありません。これは役に立ちません。時間を失うだけです。

于 2010-06-08T11:43:08.913 に答える