如何使用NHibernate映射多个接口实现

时间:2011-04-03 05:03:18

标签: nhibernate entity-framework orm fluent-nhibernate

我搜索了很多关于如何使用EntityFramework或NHibernate映射多重继承或多接口植入但是我找不到任何有用的东西。

我只想使用NHibernate来映射这个结构:

    public interface IA
    {
        string A { get; set; }
    }

    public interface IB
    {
        string B { get; set; }
    }

    public class C : IA, IB
    {
        string A { get; set; }
        string B { get; set; }            
    }

据我所知,将此结构映射到关系数据库意味着只需要将外键与接口主键相关联,因此接口应该具有以下键:

public interface IA
{
    Guid AId { get; set; }
    string A { get; set; }
}

public interface IB
{
    Guid BId { get; set; }
    string B { get; set; }
}

public class C : IA, IB
{
   public virtual Guid AId { get; set; }
   public virtual Guid BId { get; set; }
   public virtual string A { get; set; }
   public virtual string B { get; set; }
}

但是如何使用NHibernate或EntityFramework映射此结构,我不知道为什么在他们的文档中没有提到多个接口映射!

3 个答案:

答案 0 :(得分:1)

在NHibernate中,您只需将C 映射为接口不存在

由于隐式多态性,您仍然可以在接口上进行查询。

答案 1 :(得分:0)

您将其映射为任何其他类,因为这不是继承映射。此外,您的代码无法编译,因为您必须实现类C中的所有属性,因此您将获得:

public interface IA
{
    Guid AId { get; set; }
    string A { get; set; }
}

public interface IB
{
    Guid BId { get; set; }
    string A { get; set; }
}

public class C : IA, IB
{
    public virtual Guid AId { get; set; }
    public virtual Guid BId { get; set; }
    public virtual string A { get; set; }
}

现在您的代码可以编译,并且您可以像其他任何类一样使用类。您将AId和BId映射为复合键(取决于使用的ORM),您就完成了。这不是继承,因为您只有单个实体而没有基本实体。至少这是它如何与Entity框架一起使用。

答案 2 :(得分:0)

正如我所创建的那样,由于这个概念以及迭代所说的“非接口获取持久化场景”,因此不可能在关系数据库中进行多重继承。