C# - EF 6 抽象导航属性

3

我有以下的抽象类:

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 中,是否有一种方法告诉ICollection of NotaFiscalItem将是NotaFiscalEntradaItem,并且EF将理解并导航到它?

我需要以这种方式使用它,因为集合的智能(LINQ查询,总和等)都在抽象类中,而其他类如NotaFiscalSaidaNotaFiscalItemSaida将从抽象类创建。每个表都将成为DB中的一个表。

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


ICollection<NotaFiscalItem> 属性的名称是什么? - haim770
抱歉,我的错误,名称应该是NotaFiscalItens。已编辑帖子。对不起。 - MurariAlex
1个回答

4

实体框架不支持泛型实体,但它支持继承泛型类的实体

尝试将抽象的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集合。


太好了!没错!有一个问题:我能在其中使用延迟加载吗?因为它缺少激活它的虚拟修饰符。 - MurariAlex
@AlexandreMurariJunior,“abstract”意味着“virtual”,所以答案是肯定的。严格来说,“virtual”并不会“激活”延迟加载,而是允许它发生。 - haim770
我明白了,我忘记了重写规则(virtual可以重写,abstract必须重写),所有这些都意味着virtual。非常感谢,那真的很有帮助。 - MurariAlex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接