背景: 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 が使用されないのはなぜですか?
ありがとう!