【问题标题】:Mapping navigation property in abstract base class with Entity Framework Core使用 Entity Framework Core 映射抽象基类中的导航属性
【发布时间】:2018-04-14 16:46:34
【问题描述】:

我有不同的汽车,每辆汽车都有特定的汽车类型。 所有汽车都继承自同一个抽象基类 CarBase。 CarBase 类具有 CarType 的导航属性。

public abstract CarTypeBase 
{ 
    public string Name { get; set; }
}

public class FordCarType : CarTypeBase 
{

}

public abstract class CarBase {
     public CarTypeBase CarType { get; set; }

     public string GetName() {
           return CarType.Name;
     }      
}

public class Ford : CarBase {

}

福特使用以下 EF 映射配置进行映射:

builder.HasOne(o => (FordCarType) o.CarType);

对于 CarTypeBase 类,我使用 Entity Framework 的默认 Table per Hierarchy (TPH) 映射,因此 CarTypeBase 表有一个鉴别器列。 Ford 表有一个 CarTypeBase 表的外键。

问题是,如果我试图在 GetName() 方法中访问 Ford CarType 导航属性,它总是为空。如果我改用具体类型 FordCarType,CarType 属性将映射到 Ford 类中。

那么也许我想要实现的目标是 EF 无法实现的,或者根本不可能实现?

【问题讨论】:

  • “问题是福特 CarType 导航属性始终为空”请添加获取此信息的代码
  • 感谢您的评论,我在 CarBase 类中添加了 GetName() 方法。尝试访问 CarTypeBase 的 Name 属性是不可能的,因为 CarType 为 null。
  • 我认为您没有理解我的评论。我的意思是,将代码添加到如何获取实例(如何从数据库中加载它)
  • 我从 ApplicationDbContext 中获取我的汽车,例如 context.Cars。但我意识到,我没有指定包含 CarType,据我所知,EF Core 还不支持延迟加载。所以这可能是问题所在。但是当我包含像 context.Cars.Include(o => o.CarType) 这样的 CarType 时,我得到一个 ArgumentException "Argument types do not match"。

标签: c# entity-framework-core


【解决方案1】:

聚会迟到了,但不应该这样吗:

public abstract CarTypeBase 
{ 
    public string Name { get; set; }
}

public abstract class CarBase : CarTypeBase  {
        
     public string GetName() {
           return this.Name;
     }      
}

public class Ford : CarBase {

}

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2023-03-17
    • 2014-08-20
    • 2017-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多