3

我们有以下一组对象。

public class Form
{
    public int FormId { get; set; }
    public DateTime DateCreatedOn { get; set; }
    public string Status { get; set; }
}

// This is using TPT inheritance from Form
[Table("FormA")]
public class FormA : Form
{
    public string ExtraInfoA { get; set; }
    public virtual ICollection<Child> Children
}

// This is using TPT inheritance from Form
[Table("FormB")]
public class FormB : Form
{
    public string ExtraInfoB { get; set; }
    public virtual ICollection<Adult> Adults
}

public class Person
{
    public int PersonId { get; set; }
    public int FormId
    public DateTime DateOfBirth { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// This is using TPH inheritance from Person
public class Adult : Person
{
    public int HowManyCars { get; set; }
    public string NationalInsuranceNo { get; set; }
    [ForeignKey("FormId")]
    public virtual FormB FormB { get; set; }
}

// This is using TPH inheritance from Person
public class Child : Person
{
    public int HowManyToys { get; set; }
    public string SchoolName { get; set; }
    [ForeignKey("FormId")]
    public virtual FormA FormA { get; set; }
}

这将创建 3 个表格FormFormA其中FormB包含相应的字段。它还为Person.

问题是当我们依赖约定而不指定ForeignKey属性时,Person表包含 2 个额外的外键列。

但是,当我们指定ForeignKey属性时(如上面的代码),我们会收到以下错误消息。

`The foreign key component 'FormId' is not a declared property on type 'Child'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property.`

FormId绝对是的属性,Child所以我不确定出了什么问题。

我们现实世界的情况比上面的情况复杂得多,所以我想现在就得到它,而不是有多个外键。

很感谢任何形式的帮助。

4

1 回答 1

8

您不能在父实体中定义外键,在子实体中定义导航属性。它们必须在同一个实体中定义。您尝试做的甚至在数据库中无效,因为您不能对列有条件外键约束 - 对两者的约束FormA并将FormB应用于每条记录,您将永远无法插入任何记录(因为它总是违反对FormAor的约束FormB

简而言之:您需要父级中的单个导航属性或每个子级的单独外键。

于 2012-08-10T12:18:45.043 回答