C# 用实体框架核心映射抽象基类中的导航属性
我有不同的车,每辆车都有特定的车型。 所有汽车都继承自同一抽象基类CarBase。CarBase类具有CarType的navigaiton属性C# 用实体框架核心映射抽象基类中的导航属性,c#,entity-framework-core,C#,Entity Framework Core,我有不同的车,每辆车都有特定的车型。 所有汽车都继承自同一抽象基类CarBase。CarBase类具有CarType的navigaiton属性 public abstract CarTypeBase { public string Name { get; set; } } public class FordCarType : CarTypeBase { } public abstract class CarBase { public CarTypeBase CarT
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类,我使用实体框架的默认层次表(TPH)映射,因此CarTypeBase表有一个鉴别器列。
Ford表有一个到CarTypeBase表的外键
问题是,如果我试图访问Ford CarType navigation属性,例如在GetName()方法中,该属性总是为null。如果我改为使用具体类型FordCarType,CarType属性将映射到Ford类中
因此,也许我想要实现的是EF不可能实现的,或者根本不可能实现的?晚会迟到了,但这不应该是:
public abstract CarTypeBase
{
public string Name { get; set; }
}
public abstract class CarBase : CarTypeBase {
public string GetName() {
return this.Name;
}
}
public class Ford : CarBase {
}
“问题是Ford CarType导航属性始终为空”请添加获取该属性的代码感谢您的评论,我向CarBase类添加了GetName()方法。无法尝试访问CarTypeBase的Name属性,因为CarType为null。我认为您不理解我的评论。我的意思是,将代码添加到获取实例的方式(从数据库加载实例的方式)中。我从ApplicationDbContext获取汽车,比如context.cars。但我意识到,我还没有指定要包含CarType,据我所知,efcore中还不支持延迟加载。所以这可能就是问题所在。但是当我包含像context.Cars.include(o=>o.CarType)这样的CarType时,我会得到一个ArgumentException“参数类型不匹配”。