将Id映射到EF5.0中数据表中的ClassName+Id字段

Map Id to ClassName+Id field in the datatable in EF5.0

有一个 EFCore-5.0 应用程序,我尝试将 Foo 的 class Id 属性 映射到数据库中的 FooId 字段名称.

我尝试(遵循 this 旧的 link)将其映射到我的 OnModelCreating 的 DbContext

modelBuilder.Properties()
    .Where(p => p.Name == "Id")
    .Configure(p => p.IsKey().HasColumnName(p.ClrPropertyInfo.ReflectedType.Name + "Id"));

然而它告诉我

Error CS1061 'ModelBuilder' does not contain a definition for 'Properties' and no accessible extension method 'Properties' accepting a first argument of type 'ModelBuilder' could be found (are you missing a using directive or an assembly reference?)

您提到的 link 中使用的

ModelBuilder.Properties() 来自 Entity Framework 6,不适用于 EF Core。我相信这是你问题的症结所在。

您可以参考:, , and EF Core 2.0 OwnsOne column prefix

正如@Patrick Xavier Silerio 所说,您所做的是在 EF 中使用的,而不是 EF Core。

在 EF Core 中,您需要使用 Data Annotation 或 Fluent API 配置列名称:

数据注释:

public class Foo
{
    [Column("FooId")]
    public int Id{ get; set; }
}

流利API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Foo>()
        .Property(b => b.Id)
        .HasColumnName("FooId");
}

参考:

https://docs.microsoft.com/en-us/ef/core/modeling/entity-properties?tabs=data-annotations%2Cwithout-nrt#column-names

如果你想把所有的Id改成ClassName+Id,像下面这样改:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{           
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        modelBuilder.Entity(entity.Name)
                   .Property("Id").HasColumnName(entity.GetTableName()+"Id");
    }
}