我有以下简化的EF模型:
public class BasePbx
{
public int BasePbxId { get; set; }
}
public class Pbx: BasePbx
{
public int Boo { get; set; }
}
public class BaseExtension
{
public int BaseExtensionId { get; set; }
public string Name { get; set; }
public int BasePbxId { get; set; }
public BasePbx BasePbx { get; set; }
}
public class Extension : BaseExtension
{
public Pbx Pbx { get; set; }
}
我正在尝试创建两个单向关系:
BaseExtension
到BasePbx
(使用BasePbxId
外键)Extension
到(派生)Pbx
(使用相同的 BasePbxId
外键)对于第一个关系,EF会自动从相应的导航属性名称BasePbxId
推断出外键属性(BasePbx
)。
问题在于定义第二种关系。 EF不能使用约定来猜测外键,所以我认为我会明确地说明它(顺便说一下,我需要流利地表达它,而不是属性):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Extension>()
.HasRequired(ext => ext.Pbx).WithMany().HasForeignKey(ext => ext.BasePbxId);
}
嗯......它不起作用。错误是:
System.InvalidOperationException:外键组件“BasePbxId”不是“Extension”类型的声明属性。验证它是否未从模型中明确排除,并且它是有效的原始属性。
解决方法#1:我使用.Map(...) instead of
。HasForeignKey(...)`并将数据库列名指定为字符串,但我不喜欢这种方法。
解决方法#2:我在类PbxID
中创建了一个属性Extension
,并将其映射到基类中与BasePbxId
相同的列。这看起来也很难看。
如何干净地指定外键?