【问题标题】:How to map multiple interface implementation using NHibernate如何使用 NHibernate 映射多个接口实现
【发布时间】:2011-04-03 05:03:18
【问题描述】:

我搜索了很多关于如何使用 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来映射这个结构,我不知道为什么他们的文档中没有提到多接口映射!

【问题讨论】:

    标签: nhibernate entity-framework orm fluent-nhibernate


    【解决方案1】:

    在 NHibernate 中,您只需映射 C就好像接口不存在

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

    【讨论】:

    • 为什么?!我需要保留这些接口,因为我希望将来有其他类可以实现这些接口。考虑更多像 C 这样已经实现 IA 和 IB 或者更多接口的类,我想查询所有 IA 类型的对象。
    • @Hossein:您不需要需要持久化接口来做到这一点。请阅读我写的内容。不能持久化同一个类的两个接口,也没有必要。
    【解决方案2】:

    您将把它映射为任何其他类,因为这不是继承映射。此外,您的代码无法编译,因为您必须实现类 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),您就完成了。这不是继承,因为您只有单个实体而没有基本实体。至少这是它与实体框架一起工作的方式。

    【讨论】:

    • 我刚刚编辑了我的问题,因为它似乎引起了误解,我想看看我如何在 NHibernate 中映射它!
    • 我还想要另一个实现了 IA 接口的类,所以稍后我会查询 IA 接口。
    • @Hossein:这有帮助吗:stackoverflow.com/questions/3612816/… ?
    【解决方案3】:

    正如我所创立的那样,由于这个概念,在关系数据库中不可能有多重继承,而 Diego 所说的在“非接口得到持久化的场景”中是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      相关资源
      最近更新 更多