[ForeignKey]属性与OnModelCreating或EntityTypeConfiguration的不同结果

时间:2013-10-31 19:51:47

标签: entity-framework entity-framework-5 entity-framework-6

对于后台:我正在尝试保持我的EF POCO不受EF的引用,因此所有模型配置代码都将进入OnModelCreating或EntityTypeConfiguration类而不是使用属性(从而避免引用System.ComponentModel.DataAnnotations。架构)。问题是当属性没有建立外键时,在构建模型时似乎忽略了它。这是一个例子:

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; }
}

产生这个:

create table [dbo].[Groups] (
    [Id] [int] not null identity,
    primary key ([Id])
);
create table [dbo].[People] (
    [Id] [int] not null identity,
    [GroupId] [int] null,
    primary key ([Id])
);
alter table [dbo].[People] add constraint [Person_Group] foreign key ([GroupId]) references [dbo].[Groups]([Id]);

完美。

但是将其移动到OnModelCreating(或等效的EntityTypeConfiguration代码),如下所示:

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

结果就是这样(对于新的或迁移的数据库):

create table [dbo].[Groups] (***same as above***);
create table [dbo].[People] (
    [Id] [int] not null identity,
    [GroupId] [int] null,
    [Group_Id] [int] null,
    primary key ([Id])
);
alter table [dbo].[People] add constraint [Group_People] foreign key ([Group_Id]) references [dbo].[Groups]([Id]);
alter table [dbo].[People] add constraint [Person_Group] foreign key ([GroupId]) references [dbo].[Groups]([Id]);

为什么要创建Group_Id,为什么不使用GroupId?

谢谢!

1 个答案:

答案 0 :(得分:1)

看起来你的映射是错误的。

由于您在Group中有导航属性,因此需要将其包含在以下映射中:

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

否则EF将使用导航属性来实现2个实体之间的不同关系,并创建另一个外键。