S#arp Architecture多対多マッピングオーバーライドが機能しない
-
08-07-2019 - |
質問
S#arp ArchitectureでM:Mマッピングを機能させるために、ほぼすべてを試しました。残念ながら、NorthwindサンプルプロジェクトにはM:Mオーバーライドがありません。
S#arpおよびFluent NHibernateのAutoマッピングの選択に変換する前に、私のプロジェクトですべてが正常に機能しました。私は自動マッピングが好きです、それは良いですが、オーバーライドは登録されていないようです。
それはすべてメモリとテストで動作するようですが、データベースにデータをコミットするとき、M:M参照テーブルには何も挿入されません。
Categoryの単純なサンプルを多数の製品を持つことができ、Productを多数のカテゴリに含めることができる場合、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自動マッピングオーバーライドの問題に遭遇し、解決したことを願っています。
解決
問題を解決できたが、S#arp初心者エラーであることが判明した。
ManyToManyデータを保存するには、コントローラーメソッドに[トランザクション]属性を割り当てる必要があります。