EF Core,包括派生类型属性

时间:2020-09-15 12:09:46

标签: c# entity-framework entity-framework-core ef-database-first

我对特定的include语句有一个小问题。 我的数据结构如下:

[Table("item")]
public class Item
{
  public int Id { get; set; }
  public string ItemCode { get; set; }
  ...
}

public abstract class DerivedItemAbstractBase : Item
{
  [ForeignKey("ItemId")]
  public List<Assignment> Assignments { get; set; }
  ...
}

[Table("item")]
public class DerivedItemA : DerivedItemAbstractBase
{
  ...
}

[Table("item")]
public class DerivedItemB : DerivedItemAbstractBase
{
  ...
}

public class ItemContext : DbContext
{
  public DbSet<Item> Items { get; set; }
  ...
}

现在,我想获取所有DerivedItemA的列表并包括其属性。 我有以下方法:

public List<DerivedItemA> GetDerivedItemsA()
{
  var list = _context.Items
             .Include(x => (x as DerivedItemA).Assignments)
             .ToList();
}

这段代码可以很好地编译,这是我在stackoverflow上发现的。 但是,执行此操作会导致短信Invalid include异常。 我不知道如何解决这个问题。 该项目是数据库优先的方法,因此我无法控制数据库。 所有项目都存储在同一表item中。 我无法创建多个DbSets,因为该表中没有鉴别符列, 无法在代码中配置自定义标识符,因为它需要根据多个属性而非一个属性进行区分。

还有其他方法吗? 目前,我正在通过迭代所有ItemContext.Items然后在每个.Select()上创建一个new DerivedItemA来解决它。之后,我通过从Assignment表进行迭代来手动设置每个Assignment。 但是,这种方法花费的时间太长,如果我可以将其包括在初始查询中,则会更快。

0 个答案:

没有答案