流利的Nhibernate Automapping。关联是指未映射的基类

时间:2013-05-20 09:47:50

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有以下情况:

带有数据库实体的

AssemblyX 指的是外部 assemblyY ,并使用其类作为基类。 AssemblyX 添加了一些导航必要时的属性。

当然我可以复制所有这些entites并使用automapper来解决我的问题,但我有理由继承现有的实体。

所以,我在 assemblyY 中有Foo {}个课程,并在 assemblyX 中创建Bar: Foo {}。配置流畅的自动化以忽略Foo (.IgnoreBase<Foo>())。一切都很好。但是 assemblyY 有另一个实体Rab(由流畅的自动化覆盖),它具有引用Foo的导航属性。这导致异常:“表Rab中的关联引用了未映射的类:Foo”。

public class Foo // .IgnoreBase<Foo>() - I require only derived Bar in DB
{
    public virtual Guid Id {get; set;}        
}

public class Bar: Foo
{
    public virtual Guid Id {get; set;}
    // Some new properties
}

public class Rab
{
    public virtual Guid Id {get; set;}
    public virtual Foo Foo // reference to unmapped class, I could not change type to Bar (external assembly)
}

我该如何解决?我尝试继承Rab并使用Bar类型创建new Foo属性,但未成功。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义IAutomappingConfiguration来确定应映射哪种类型或成员:

class MyConfig : DefaultAutomappingConfiguration
        {
            public override bool ShouldMap(Type type)
            {
                return  !(typeof(Foo)).IsAssignableFrom(type);
            }

            public override bool ShouldMap(Member member)
            {
                return  !(typeof(Foo)).IsAssignableFrom(member.PropertyType);                }
        }

然后您可以像这样使用您的配置:

AutoPersistenceModel model = new AutoPersistenceModel(new MyConfig());

最后:

Fluently.Configure()

                    .Mappings(m => m.UsePersistenceModel(model))
                    .BuildSessionFactory();