FluentNHibernate通过接口自动化多对多

时间:2014-02-10 14:14:58

标签: c# .net fluent-nhibernate

在我使用引用中的接口而不是具体类的特定情况下,我找不到如何使用自动化约定来设置NHibernate以检测我的多对多关系。请注意,这与One-To-Many和Many-To-One案例完美配合。 好吧,例如我有两个实体:

    public class Model4 : ModelBase, IModel4
    {
        public Model4()
        {
            Model5s = new List<IModel5>();
        }

        public virtual ValueInt D { get; set; }
        public virtual IList<IModel5> Model5s { get; set; }

    }

    public class Model5 : ModelBase, IModel5
    {
        public Model5()
        {
            Model4s = new List<IModel4>();
        }

        public virtual ValueInt E { get; set; }
        public virtual IList<IModel4> Model4s { get; set; }

    }

其中接口定义为:

    public interface IModel4 : IModelBase
    {
        ValueInt D { get; set; }
        IList<IModel5> Model5s { get; set; } 
    }

    public interface IModel5 : IModelBase
    {
        ValueInt E { get; set; }
        IList<IModel4> Model4s { get; set; } 
    }

我正在使用引用约定来在映射时将接口转换为类实现:

public class ReferenceConvention : IReferenceConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance)
    {
        Type instanceType = instance.Class.GetUnderlyingSystemType();

        if (instanceType.IsInterface)
        {
            // Assuming that the type starts with an I get the name of the concrete class
            string className = instanceType.Name.Substring(1);

            instance.CustomClass(instanceType.Assembly.GetType(
                instanceType.FullName.Replace(instanceType.Name, className)));
        }

        instance.Cascade.All();
    }
}

我希望NHibernate能够检测到model4&lt; - &gt; model5多对多关系并调用我的ManyToMany约定:

 public class ManyToManyConvention : IHasManyToManyConvention
    {
        public void Apply(IManyToManyCollectionInstance instance)
        {
            //this code is not reached when using references through interfaces
        }

    }

在我使用带接口的引用(IList和IList)的情况下,NHibernate永远不会调用ManyToManyConvention的Apply方法。

但是,如果我使用具体实现(IList和IList),则调用Apply代码并按预期完成映射。

你知道我在哪里错过我错误的地方吗?

0 个答案:

没有答案