2

我已经尝试了几乎所有方法来让 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>();

Category 的映射覆盖如下所示:

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 初学者错误。

对于要保存的多对多数据,控制器方法需要分配给它的 [Transaction] 属性。

于 2009-12-03T08:24:44.050 回答