我已经尝试了很多东西来让M:M映射在S#arp架构中工作。不幸的是,Northwind示例项目没有M:M覆盖。
在转换为S#arp并选择Fluent NHibernate的自动映射之前,我的项目都运行良好。我喜欢自动映射,这很好,但是覆盖似乎没有注册。
这一切似乎都在内存和测试中工作,但是当将数据提交到数据库时,没有任何内容插入到我的M:M参考表中。
如果我们采用一个类别的简单样本可以有许多产品而一个产品可以在许多类别中,我们将有一个名为CategoryProduct的表(我不喜欢复数),它有列Category_id和Product_id。
我的自动持久性模型生成如下:
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映射的组合,但没有任何作用。
这个article建议用更新FHN重新编译S#arp,我试过这个但是最新的FHN代码与S#arp使用的代码差不多。修复了所有破坏性冲突,但仍然无效。
希望其他人遇到并解决了M:M自动映射覆盖S#arp。
的问题答案 0 :(得分:1)
管理解决问题,原来是S#arp初学者错误。
对于要保存的ManyToMany数据,控制器方法需要为其分配[Transaction]属性。