【问题标题】:Interface inheritance issues in one-to-many relationship in Entity Framework实体框架中一对多关系中的接口继承问题
【发布时间】:2010-11-05 17:51:55
【问题描述】:

我有一个域模型指定接口或我的域,并且我正在使用 DI 将其连接到实体框架 4 存储库实现。在我的域中,我有以下内容:

public interface IInboundGateway : IGateway
{
    ICollection<IInboundNumber> InboundNumbers { get; set; }
}

然后我的实体框架模型生成了 InboundGateway 类:

public partial class InboundGateway : EntityObject
{
    public EntityCollection<InboundNumber> InboundNumbers { get; set; }
}

为了实现 IInboundGateway 接口,我创建了一个部分 InboundGateway 类。

public partial class InboundGateway : IInboundGateway
{
}

尽管 EntityCollection 实现了 ICollection 并且 InboundNumber 实现了 IInboundNumber 我收到一个错误报告,指出 InboundGateway 没有实现接口 IInboundGateway.InboundNumbers 因为 InboundGateway.InboundNumbers 没有匹配的返回类型 ICollection&lt;IInboundNumber&gt;

我很确定这是因为 EntityCollection 确实实现了 ICollection 而 InboundNumber 确实实现了 IInboundNumber。

任何帮助将不胜感激。

【问题讨论】:

    标签: entity-framework inheritance interface entity-framework-4


    【解决方案1】:

    您必须知道EntityCollection&lt;InboundNumber&gt;ICollection&lt;InboundNumber&gt; 的子类型,但不是ICollection&lt;IInboundNumber&gt; 的子类型。这是 2 种不同的类型,不相关。

    所以在你拥有的实体对象类中:

    public EntityCollection<InboundNumber> InboundNumbers { get; set; }
    

    虽然编译器希望您拥有:

    public ICollection<IInboundNumber> InboundNumbers { get; set; }
    


    如果您可以将 EntityObjects 转换为 POCO,则部分问题将得到解决,因为 POCO 类默认使用 ICollection 作为其导航属性。此外,您需要像这样更改界面:

    public interface IInboundGateway : IGateway {
        ICollection InboundNumbers { get; set; }
    }
    

    【讨论】:

    • 当然考虑到 InboundNumbers 也是部分继承 IInboundNumber 意味着编译器可以看到 InboundNumber 继承了 IInboundNumber?没有?
    • 不,就像我说的那样,即使 InboundNumbers 正在实现 IInboundNumber,但您不能在需要 ICollection 的地方返回 ICollection。请注意,Covariance 在泛型中不起作用,这意味着 List 不是 List 的子类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多