【发布时间】: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"。