Идентификатор сопоставления с полем ClassName+Id в таблице данных в EF5.0

Имея приложение EFCore-5.0, я пытаюсь сопоставить свойство Foo класса Id с именем поля FooId в БД.

Я пытаюсь (следуя этому старая ссылка), чтобы отобразить ее в моем OnModelCreating DbContext

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

Однако это говорит мне

Ошибка CS1061 «ModelBuilder» не содержит определения для «Свойства», и не удалось найти доступный метод расширения «Свойства», принимающий первый аргумент типа «ModelBuilder» (вам не хватает директивы использования или ссылки на сборку?)


person serge    schedule 12.01.2021    source источник


Ответы (2)


Как сказал @Patrick Xavier Silerio, то, что вы сделали, используется в EF, а не в EF Core.

В EF Core для настройки имени столбца необходимо использовать аннотацию данных или 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");
    }
}
person Rena    schedule 12.01.2021
comment
кстати, в последнем коде вы удалили вызов base.OnModelCreating(modelBuilder)... можно ли, если я новичок, просто заменить базовый метод предоставленным вами кодом? - person serge; 12.01.2021
comment
Все в порядке. Я думаю, вам нужно обратиться к этому ответу, который прекрасно объясняет: stackoverflow.com/a/39576336/11398810. - person Rena; 12.01.2021

ModelBuilder.Properties(), используемый в упомянутой вами ссылке, относится к Entity Framework 6, а не к EF Core. Я считаю, что это суть вашей проблемы.

Вы можете обратиться к: Установить имена столбцов во время OnModelCreating, Удалить префикс таблицы с помощью .net Core и Префикс столбца EF Core 2.0 OwnsOne

person Patrick Xavier Silerio    schedule 12.01.2021