实体框架导航属性接口类型

发布于 2024-12-27 19:08:16 字数 583 浏览 2 评论 0原文

我正在使用实体框架代码优先创建一个应用程序,在遵循接口隔离原则的同时,我遇到了 EF 限制的一些问题。 UML 中的应用程序模型架构的一部分

    public interface IProduct
{
    int Id { get; set; }
    ICollection<IProcess> Processes { get; set; }
    ICollection<ILine> Lines { get; set; }
    String Description { get; set; }
    String Number { get; set; }
    String Name { get; set; }
}

问题是 Processes 和 Lines 属性,因为它无法确定具体是哪个类类型(我猜)。

我知道通过使用抽象类我可以实现几乎相同的效果。我之所以没有这样做是因为我发现由于 EF 的限制而更改模型是错误的。

解决这个问题的最佳方法是什么?任何允许接口作为导航属性的 EF 替代方案。

I'm creating a application using entity framework code-first and i'm facing some problems with the limitations of EF while following the interface segration principle.
Part of application model architecture in UML

    public interface IProduct
{
    int Id { get; set; }
    ICollection<IProcess> Processes { get; set; }
    ICollection<ILine> Lines { get; set; }
    String Description { get; set; }
    String Number { get; set; }
    String Name { get; set; }
}

Problem is the Processes and Lines property cause it can't figure out which class in the concrete type (I presume).

I know that i could achieve almost the same by using abstract classes. Reason why i haven't just done this is that i find it wrong to change the model because of EF limitations.

What will be the best way to solve this? Any alternative to EF that allows interfaces as navigation property.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拍不死你 2025-01-03 19:08:16

只有一种方法可以解决这个问题 - 使用持久化到数据库的具体类。 EF 不支持任何其他方式。即使使用抽象类也不会帮助你,除非你映射整个继承树(不要这样做)。

如果您希望属性公开接口,则必须提供第二个非映射属性,该属性将在内部从公开具体类型的属性进行转换。

简而言之,如果您想使用 EF,您必须调整您的架构以遵循其功能集。

There is only one way to solve this - use concrete classes persisted to the database. EF doesn't support any other way. Even using abstract classes will not help you unless you map the whole inheritance tree (don't do that).

If you want property exposing an interface you must offer second non mapped property which will do the conversion from property exposing concrete type internally.

Simply if you want to use EF you must bend your architecture to follow its feature set.

愁以何悠 2025-01-03 19:08:16

我知道这是一个旧线程,但如果其他人遇到它,我有一个更好的使用 EF 的解决方法。

基本上我有两个接口

public interface IProduct
{
    int Id { get; set; }
    String Description { get; set; }
    String Number { get; set; }
    String Name { get; set; }
}

,并且

public interface IEFProduct
{
    ICollection<IProcess> Processes { get; set; }
    ICollection<ILine> Lines { get; set; }
}

我将 IProduct 接口保留在我的合约项目中,因此它仍然完全独立于我的模型的其余部分,但我将 IEFProduct 接口放在我的合约项目中模型项目作为具体的实现。这意味着我无法从任何实现接口而不是具体类型的东西访问流程和线路,但就我而言,它让我解决了这个问题。

另一种方法是使用 DTO。

您的模型将全部使用该接口,但您的实际 EF 实现将使用具体 DTO,在数据层中,您将手动或使用 Automapper 在它们之间进行映射 - 当然,这可能会对性能产生轻微影响。

I know this is an old thread, but in case anyone else comes across it I have a slightly better workaround for using EF.

Basically I have two interfaces

public interface IProduct
{
    int Id { get; set; }
    String Description { get; set; }
    String Number { get; set; }
    String Name { get; set; }
}

and

public interface IEFProduct
{
    ICollection<IProcess> Processes { get; set; }
    ICollection<ILine> Lines { get; set; }
}

I keep the IProduct interface in my contracts project, therefore it still completely independent on the rest of my model, but I put the IEFProduct interface in my Model project as this holds the concrete implementation. It means that I cannot access the processes and lines from anything that implements the interface rather than the concrete type, but in my case it got me around the issue.

The other way forward would be using DTOs.

Your models would all use the interface, but your actual EF implementation would use Concrete DTOs, in the data layer your would map between them either manually or using Automapper - of course this may have a slight performance impact.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文