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自動マッピングオーバーライドの問題に遭遇して解決しました。