C# - EF 6 抽象导航属性

标签 c# entity-framework ef-code-first abstract-class poco

我有以下抽象类:

NotaFiscal:

public abstract partial class NotaFiscal
{   
    public virtual ICollection<NotaFiscalItem> NotaFiscalItens { get; set; }
}

NotaFiscalItem:

public abstract class NotaFiscalItem
{   
    ...
}

具体类将从中生成:

NotaFiscalEntrada:

public class NotaFiscalEntrada : NotaFiscal
{   
    public int NotaFiscalEntradaId { get; set; }
}

NotaFiscalEntradaItem:

public class NotaFiscalEntradaItem : NotaFiscalItem
{   
    public int NotaFiscalEntradaItemId { get; set; }
}

问题: 抽象类NotaFiscal中的导航属性是抽象对象的集合,有没有办法在具体类NotaFiscalEntrada中导航到集合中的对象,这将是也很具体 - NotaFiscalEntradaItem?有没有办法告诉在具体类 NotaFiscalEntrada 中,NotaFiscalItem 的 ICollection 将是 NotaFiscalEntradaItem 并且 EF 将理解这一点并导航到它?

我必须这样使用它,因为集合的智能(LINQ 查询、求和...等等)都在抽象类中,而其他类如 NotaFiscalSaida NotaFiscalItemSaida 将从抽象类创建。每一个都将是数据库中的一个表。

我正在使用 Code First、POCO、EF 6.1 和 TPC 映射。

最佳答案

Entity Framework 不支持通用实体,但它支持继承通用类的实体

尝试更改您的抽象 NotaFiscal 类,使其具有通用参数来表示每个 NotaFiscalItem:

public abstract class NotaFiscal<T> where T : NotaFiscalItem
{
    public abstract ICollection<T> NotaFiscalItems { get; set; }
}

然后在你的具体类中:

public class NotaFiscalEntrada : NotaFiscal<NotaFiscalEntradaItem>
{
    public int NotaFiscalEntradaId { get; set; }

    public override ICollection<NotaFiscalEntradaItem> NotaFiscalItems { get; set; }
}

这样,您的具体 NotaFiscal 类型将能够使用每个类型的 NotaFiscalItems 属性公开其具体的 NotaFiscalItem 集合。

关于C# - EF 6 抽象导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27526999/

相关文章:

c# - 将 Nuget 包从一个项目添加到另一个项目

c# - 当List <>在C#7.2中具有“in”参数修饰符时,为什么仍可以修改它?

c# - MVC4 使用什么加密?

带有 Entity Framework 4 的 ASP.NET MVC2 - 存储库中的 AsEnumerable() 或 ToList()?

c# - Code-First 应用程序中的 XML 列

c# - 使用 HasColumnAnnotation 可能有多个索引?

c# - NLog 在 Azure 中不起作用

entity-framework - 使用 EF 6 查找并包含

c# - 为每种类型选择最新项目

entity-framework - 我们如何在 Entity Framework 7 上配置约定?