实体框架重复复合键值

时间:2014-04-15 00:40:40

标签: entity-framework ef-code-first composite-primary-key

使用实体框架代码首先,我在使用复合键插入行时会看到非常奇怪的行为。复合键由guid ID字段和guid外键字段组成,创建“识别关系”。奇怪的行为是,无论我将ID和外键字段设置为什么,生成的SQL都将它们设置为外键值。

我的课程如下:

public class Parent {
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }
    public ICollection<Child> Children { get; set; }
}

public class Child {
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }
    public Guid ParentId { get; set; }
}

在我的DbContext文件中,我有:

modelBuilder.Entity<Child>().HasKey(c => new { c.Id, c.ParentId });

做类似的事情:

var parent = new Parent() { Id = Guid.NewGuid() };
var child = new Child() { Id = Guid.NewGuid(), ParentId = parent.Id };
parent.Children.Add(child);

您认为执行的SQL会插入一个具有不同Id和ParentId值的新子项。但相反,我所看到的是:

// Assume parent is already in the DB, with ID of '1b1a6ecd-00ad-4265-ac0d-9a50bd30e247'
INSERT [dbo].[Child]
   ([Id],
    [ParentId])
VALUES ('1b1a6ecd-00ad-4265-ac0d-9a50bd30e247' /* @0 */,
    '1b1a6ecd-00ad-4265-ac0d-9a50bd30e247' /* @1 */)

为什么SQL使用两个字段的ParentId值?这根本没有意义。

更新

除非我完全误解EF的基本内容,否则我认为这一定是个错误。我已将一个微小的可重现项目上传到http://1drv.ms/1kX2oVC

它使用EF 6.1和.NET 4.5。我希望一些EF专家可以在这里发声并确认这是一个错误,或者我正在做一些根本错误的事情。

1 个答案:

答案 0 :(得分:2)

通过此设置,Entity Framework无法正确推断关联。您有两种选择如何解决它:

  • modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId);添加到您的OnModelCreating

  • public Parent Parent { get; set; }添加到您的Child实体中。