实体框架单向关系 - 如何指定外键?

时间:2015-10-23 12:26:51

标签: c# entity-framework orm foreign-keys foreign-key-relationship

我有以下简化的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; }
}

我正在尝试创建两个单向关系:

  • BaseExtensionBasePbx(使用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相同的列。这看起来也很难看。

如何干净地指定外键?

0 个答案:

没有答案