2011-04-03 60 views
1

我搜索了很多关于如何使用EntityFramework或NHibernate映射多重继承或多接口植入但我没有发现任何有用的东西。如何使用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映射这个结构,我不知道为什么多接口映射不是他们的文档中提及!

回答

0

正如我所发现的,由于这个概念以及Diego所说的“不接口持久化场景”中的关系数据库中的多重继承是不可能的。

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),然后完成。这不是继承,因为你只有单一的实体而没有基础。至少这是它如何与实体框架一起工作。

+0

我刚刚编辑我的问题,因为它似乎导致误导,我想看看我怎么可以映射它在NHibernate例如! – Hogaf 2011-04-03 11:20:10

+0

我也想要另一个实现了IA接口的类,所以稍后我会查询IA接口。 – Hogaf 2011-04-03 11:30:21

+0

@Hossein:这是否有帮助:http://stackoverflow.com/questions/3612816/nhibernate-query-all-objects-implementing-an-interface? – 2011-04-03 11:45:53

1

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

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

+0

为什么?!我需要将接口持久化,因为我希望有其他类将来可以实现这些接口。考虑像C这样的类已经实现了IA和IB或者更多的接口,并且我想要查询IA类型的所有对象。 – Hogaf 2011-04-03 14:56:59

+0

@Hossein:你**不需要坚持接口来做到这一点。请阅读我写的内容。不可能坚持同一个类的两个接口,这是没有必要的。 – 2011-04-03 15:15:19