使用实体框架代码首先,我在使用复合键插入行时会看到非常奇怪的行为。复合键由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专家可以在这里发声并确认这是一个错误,或者我正在做一些根本错误的事情。
答案 0 :(得分:2)
通过此设置,Entity Framework无法正确推断关联。您有两种选择如何解决它:
modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId);
添加到您的OnModelCreating
。或
public Parent Parent { get; set; }
添加到您的Child
实体中。