2

背景: 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; }
}

これが生成されます:

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

結果は次のようになります (新しい DB または移行された DB の場合):

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 が使用されないのはなぜですか?

ありがとう!

4

1 に答える 1

1

マッピングが間違っているようです。

ナビゲーション プロパティがGroupあるため、次のようにマッピングに含める必要があります。

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

それ以外の場合、EF は 2 つのエンティティ間の別の関係にナビゲーション プロパティを使用し、別の外部キーを作成します。

于 2013-10-31T20:44:36.557 に答える