FluentNHibernate HasManyToMany Convention覆盖

时间:2014-02-12 11:17:40

标签: c# nhibernate fluent-nhibernate many-to-many fluent-nhibernate-mapping

我正在使用FluentNhibernate。我正在努力使我的Map文件尽可能轻量化,依赖于Convention文件来处理表名,外键列等。

我的HasManyToManyConvention有点问题。

我有2个对象。 Models.ProcessorModels.Worker

处理器可以与许多工作人员相关联,反之亦然。

public class Processor : Entity
{
    ...
    public virtual IList<Worker> Workers { get; set; }
    public virtual void AddWorker(Worker worker)
    {
        worker.AddProcessor(this);
        Workers.Add(worker);
    }
}

public class Worker : Entity
{
    ...
    public virtual IList<Processor> Processors { get; set; }
    public virtual void AddProcessor(Processor processor)
    {
        processor.AddWorker(this);
        Processors.Add(processor);
    }
}

我还有2张地图将2个实体相互映射。

public ProcessorMap()
{
    HasManyToMany<Processor>(x => x.Workers)
            .Table("WorkerProcessor")
            .ParentKeyColumn("ProcessorId")
            .ChildKeyColumn("WorkerId");
}

此时一切正常。

与Parent&amp ;;的WorkerMap的互惠设置儿童钥匙反转。我想以这样的方式设置它,我不需要指定表格和放大器。地图中的parentkey / childkey属性,所以我在项目中添加了一些约定,并将它们包含在流畅的配置中。

public class ForeignKeyConvention : FluentNHibernate.Conventions.ForeignKeyConvention
{
    protected override string GetKeyName(Member property, Type type)
    {
        if (property == null)
            return type.Name + "Id";

        return property.Name + "Id";
    }
}

public class HasManyToManyConvention : IHasManyToManyConvention
{
    public void Apply(IManyToManyCollectionInstance instance)
    {
        instance.Cascade.SaveUpdate();
    }
}

public class ManyToManyTableNameConvention :
             FluentNHibernate.Conventions.ManyToManyTableNameConvention
{
    protected override string GetBiDirectionalTableName(
              IManyToManyCollectionInspector collection,
              IManyToManyCollectionInspector otherSide)
    {
        return collection.EntityType.Name + otherSide.EntityType.Name;
    }

    protected override string GetUniDirectionalTableName(
              IManyToManyCollectionInspector collection)
    {
        return collection.EntityType.Name + collection.ChildType.Name);
    }
}

所以当我调试它时会发生什么,它是步入GetBiDirectionalTableName方法的,由于某些原因,collectionotherside属性都属于{{1}类型}。我希望1为Processor,而1为Processor。结果是FN引发了以下异常。

Worker

任何帮助/指示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

原来我在HasManyToMany()映射上遗漏了一些额外的参数。

您需要指定其中一个是Inverse()