【问题标题】:Entity Framework code first multiple tier parent child foreign key实体框架代码第一个多层父子外键
【发布时间】:2014-06-03 22:06:02
【问题描述】:

我正在尝试使用 Entity Framework 6 实现层次结构,但在超过父子关系的第一级时遇到了问题。我正在尝试做的一个例子如下:

[Table("TestParent", Schema = "dbo")]
public class TestParent {
    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int TestParentId { get; set; }

    private ICollection<TestChild> _testChildren;

    public virtual ICollection<TestChild> TestChildren {
        get { return _testChildren ?? (_testChildren = new HashSet<TestChild>()); }
        set { _testChildren = value; }
    }
}

[Table("TestChild", Schema = "dbo")]
public class TestChild {
    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int TestId { get; set; }

    [Key, ForeignKey("TestParent"), Column(Order = 2)]
    public int TestParentId { get; set; }
    public virtual TestParent TestParent { get; set; }

    private ICollection<TestGrandChild> _testGrandChildren;

    public virtual ICollection<TestGrandChild> TestGrandChildren {
        get { return _testGrandChildren ?? (_testGrandChildren = new HashSet<TestGrandChild>()); }
        set { _testGrandChildren = value; }
    }
}

[Table("TestGrandChild", Schema = "dbo")]
public class TestGrandChild {
    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int TestGrandChildId { get; set; }

    [Key, Column(Order = 2)]
    public int TestChildId { get; set; }
    public virtual TestChild Test { get; set; }
}

由于某种原因,EF 无法识别 TestGrandChild.TestChildIdTestChild.TestChildId 的外键。如果我像这样强迫它:

[Table("TestGrandChild", Schema = "dbo")]
public class TestGrandChild {
    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int TestGrandChildId { get; set; }

    [Key, ForeignKey("TestChild"), Column(Order = 2)]
    public int TestChildId { get; set; }

    public virtual TestChild Test { get; set; }
}

我收到以下错误:

System.Reflection.TargetInvocationException:调用的目标已抛出异常。 ---> System.Data.Entity.ModelConfiguration.ModelValidationException:在模型生成过程中检测到一个或多个验证错误: TestGrandChild_TestChild_Target_TestGrandChild_TestChild_Source: : 关系约束中的从属角色和主体角色中的属性数量必须相同。

让我发疯!!!!

【问题讨论】:

    标签: c# entity-framework collections parent-child hierarchy


    【解决方案1】:

    TestChild 有一个由(TestId, TestParentId) 组成的复合主键。因此,TestGrandChild 中引用 TestChild 的外键也必须是复合的,并且具有相同数量的部分——这就是异常所说明的。

    TestGrandChild 应该是这样的:

    [Table("TestGrandChild", Schema = "dbo")]
    public class TestGrandChild {
    
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public virtual int TestGrandChildId { get; set; }
    
        [Key, ForeignKey("TestChild"), Column(Order = 2)]
        public int TestId { get; set; }
    
        [Key, ForeignKey("TestChild"), Column(Order = 3)]
        public int TestParentId { get; set; }
    
        public virtual TestChild TestChild { get; set; }
    }
    

    TestGrandChild 现在有一个复合键 (TestGrandChildId, TestId, TestParentId),最后两部分 (TestId, TestParentId) 形成了 TestChild 中主键 (TestId, TestParentId) 的复合外键。

    【讨论】:

    • 完美运行。你是个传奇!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 2012-05-10
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多