2

S#arpアーキテクチャでM:Mマッピングを機能させるために、ほとんどすべてを試しました。残念ながら、NorthwindサンプルプロジェクトにはM:Mオーバーライドがありません。

S#arpに変換し、Fluent NHibernateの自動マッピングを選択する前に、私のプロジェクトではすべて正常に機能しました。私は自動マッピングが好きです、それは良いです、しかしオーバーライドは登録されていないようです。

それはすべてメモリとテストで機能するようですが、データベースにデータをコミットするとき、M:M参照テーブルには何も挿入されません。

カテゴリの単純なサンプルを取得すると、多くの製品を含めることができ、製品を多くのカテゴリに含めることができます。Category_id列とProduct_id列を持つCategoryProduct(複数形化は好きではありません)というテーブルがあります。

私の自動永続性モデルは次のように生成されます。

return AutoPersistenceModel
    .MapEntitiesFromAssemblyOf<Category>()
    .Where(GetAutoMappingFilter)
    .ConventionDiscovery.Setup(GetConventions())
    .WithSetup(GetSetup())
    .UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();

カテゴリのマッピングオーバーライドは次のようになります。

public class CategoryMap : IAutoMappingOverride<Category>
{
    public void Override(AutoMap<Category> mapping)
    {
        mapping.Id(x => x.Id, "Id")
            .WithUnsavedValue(0)
            .GeneratedBy.Identity();

        mapping.Map(x => x.Name).WithLengthOf(50);

        mapping.Map(x => x.Depth);

        mapping.HasMany<Category>(x => x.Children)
            .Cascade.All()
            .KeyColumnNames.Add("Parent_id")
            .AsBag()
            .LazyLoad();

        mapping.HasManyToMany<Posting>(x => x.Products)
            .WithTableName("CategoryProduct")
            .WithParentKeyColumn("Category_id")
            .WithChildKeyColumn("Product_id")
            .Cascade.All()
            .AsBag();
    }
}

また、製品には次のようなマッピングオーバーライドがあります。

public class ProductMap : IAutoMappingOverride<Product>
{
    public void Override(AutoMap<Product> mapping)
    {
        mapping.Id(x => x.Id, "Id")
            .WithUnsavedValue(0)
            .GeneratedBy.Identity();

        mapping.Map(x => x.Title).WithLengthOf(100);
        mapping.Map(x => x.Price);
        mapping.Map(x => x.Description).CustomSqlTypeIs("Text");
        mapping.References(x => x.Category).Cascade.All();

        mapping.HasMany<ProductImage>(x => x.Images).Inverse().Cascade.All().LazyLoad();

        mapping.HasManyToMany<Category>(x => x.Categories)
            .WithTableName("CategoryProduct")
            .WithParentKeyColumn("Product_id")
            .WithChildKeyColumn("Category_id")
            .Inverse()
            .AsBag();
    }
}

M:Mマッピングを構造化する多くの組み合わせを試しましたが、何も機能しません。

この記事では、更新FHNを使用してS#arpを再コンパイルすることを提案しています。これを試しましたが、最新のFHNコードは、S#arpで使用されているコードとは大きく異なります。すべての重大な競合を修正しましたが、それでも機能しません。

うまくいけば、他の誰かがS#arpでのM:M自動マッピングオーバーライドの問題に遭遇して解決しました。

4

1 に答える 1

1

問題を解決することができましたが、S#arp 初心者のエラーであることが判明しました。

ManyToMany データを保存するには、コントローラ メソッドに [Transaction] 属性を割り当てる必要があります。

于 2009-12-03T08:24:44.050 に答える