[ForeignKey]屬性與OnModelCreating或EntityTypeConfiguration的不同結果

entity-framework entity-framework-5 entity-framework-6

對於後台:我試圖保持我的EF POCO不受EF的引用,因此所有模型配置代碼都進入OnModelCreating或EntityTypeConfiguration類而不是使用屬性(因此避免引用System.ComponentModel.DataAnnotations.Schema)。問題是當屬性沒有建立外鍵時,在構建模型時似乎忽略了它。這是一個例子:

public class Person
{
    public int Id { get; set; }
    [ForeignKey("Group")]
    public int? GroupId { get; set; }
    public Group Group { get; set; }
}
public class Group
{
    public int Id { get; set; }
    public List<Person> People { get; set; }
}
public class Context : DbContext
{
    public DbSet<Group> Groups { get; set; }
    public DbSet<Person> People { get; set; }
}

這產生了這個:

public class Person
{
    public int Id { get; set; }
    [ForeignKey("Group")]
    public int? GroupId { get; set; }
    public Group Group { get; set; }
}
public class Group
{
    public int Id { get; set; }
    public List<Person> People { get; set; }
}
public class Context : DbContext
{
    public DbSet<Group> Groups { get; set; }
    public DbSet<Person> People { get; set; }
}

完善。

但是將其移動到OnModelCreating(或等效的EntityTypeConfiguration代碼),如下所示:

public class Person
{
    public int Id { get; set; }
    [ForeignKey("Group")]
    public int? GroupId { get; set; }
    public Group Group { get; set; }
}
public class Group
{
    public int Id { get; set; }
    public List<Person> People { get; set; }
}
public class Context : DbContext
{
    public DbSet<Group> Groups { get; set; }
    public DbSet<Person> People { get; set; }
}

結果就是這樣(對於新的或遷移的數據庫):

public class Person
{
    public int Id { get; set; }
    [ForeignKey("Group")]
    public int? GroupId { get; set; }
    public Group Group { get; set; }
}
public class Group
{
    public int Id { get; set; }
    public List<Person> People { get; set; }
}
public class Context : DbContext
{
    public DbSet<Group> Groups { get; set; }
    public DbSet<Person> People { get; set; }
}

為什麼要創建Group_Id,為什麼不使用GroupId呢?

謝謝!

一般承認的答案

看起來你的映射是錯誤的。

由於您在Group有導航屬性,因此需要將其包含在映射中,如下所示:

modelBuilder.Entity<Person>()
    .HasOptional(t => t.Group)
    .WithMany(t => t.People) // <---
    .HasForeignKey(t => t.GroupId);

否則,EF將使用導航屬性來實現2個實體之間的不同關係,並創建另一個外鍵。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因