C# 用实体框架核心映射抽象基类中的导航属性

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

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

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“参数类型不匹配”。