EntityFramework Core Fluent Model Builder 键和属性

lan*_*393 4 c# entity-framework fluent fluent-entity-framework entity-framework-core

好的,所以在实体框架 6 中,我会在一个语句中生成密钥和属性数据库:

modelBuilder.Entity<Function>()
                .HasKey(x => x.Id)
                .Property(x => x.Id)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)

在实体框架核心 (7) 中,这不起作用:

modelBuilder.Entity<Function>()
                .HasKey(x => x.Id)
                .Property(x => x.Id)
                .ValueGeneratedNever();
Run Code Online (Sandbox Code Playgroud)

错误:“‘KeyBuilder’不包含‘Property’的定义,并且没有接受‘KeyBuilder’类型的第一个参数的扩展方法‘Property’”:

这是否必须是如下两个单独的语句,或者有没有办法像在 EF6 中那样将其合并在一起?

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Function>()
                    .HasKey(x => x.Id);

    modelBuilder.Entity<Function>()
                    .Property(x => x.Id)
                    .ValueGeneratedNever();
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

是的,它们在 EF Core 中是分开的。

原因是因为 EF6 方法允许您指定 PK 列,仅此而已,因此正在返回EntityTypeConfiguration<TEntityType>(与从Entity<...>调用中获得的目标相同),这就是您可以继续流畅地配置实体类型的原因。

然而,EF核心方法返回一个不同类型的叫KeyBuilder,让您进一步配置PK,喜欢HasName的关系约束名,或特定的数据库属性,如ForSqlServerHasNameForSqlServerIsClustered等。