Префикс столбца EF Core 2.0 OwnsOne

При использовании OwnsOne для сопоставления сложных типов имя столбца sql имеет префикс с именем атрибута. Можно ли указать имя префикса в отображении?

Это мое отображение:

e.OwnsOne(x => x.Attributes, cb =>
{
    cb.OwnsOne(a => a.Supplier);
});

Я хотел бы, чтобы столбец sql имел префикс «Attr_» вместо «Attributes_». Это возможно?


person Tommy Jakobsen    schedule 10.01.2018    source источник
comment
В настоящее время это соглашение жестко запрограммировано< /а>. Вы можете отправить запрос функции на github.com/aspnet/EntityFrameworkCore/issues. Обходной путь заключается в явной настройке имен столбцов для всех свойств (включая свойства вложенного принадлежащего типа).   -  person Ivan Stoev    schedule 10.01.2018
comment
@Ivan Stoev, знаете ли вы синтаксис для явного отображения. Только что попробовал в файле IEntityTypeConfiguration: builder.Property(x=›x.Address.Postcode).HasColumnName(PostCode). но выдает исключение ArgumentException: выражение 'ea => ea.Address.Postcode' не является допустимым выражением свойства. Выражение должно представлять доступ к свойству: 't => t.MyProperty'. Имя параметра: свойствоAccessExpression   -  person Jafin    schedule 27.02.2018
comment
@Jafin Это нужно сделать с помощью соответствующего аргумента действия строителя OwnsOne. например .OwnsOne(e => e.Address, cb => { cb.Property(e => e.Postcode).HasColumnName("Postcode"); });   -  person Ivan Stoev    schedule 27.02.2018
comment
Вы также можете использовать аннотации данных для переопределения имен столбцов. например аннотация с помощью [Column("Supplier")] будет использовать это имя столбца без префикса. Атрибут Column существует в пространстве имен System.ComponentModel.DataAnnotations.Schema Преимущество этого метода в том, что он является локальным для файла класса объектов, поэтому другие разработчики, добавляющие дополнительные свойства, могут заметить необходимость переопределения имен столбцов, отметив существующие свойства.   -  person Mohammad    schedule 26.02.2019


Ответы (2)


Вы можете написать метод расширения, чтобы переопределить имена всех столбцов;

   public static void WithPrefix<T, R>(this OwnedNavigationBuilder<T, R> builder, string prefix) where T:class where R:class
   {
      foreach (var p in builder.OwnedEntityType.GetProperties())
         p.SetColumnName($"{prefix}{p.Name}");
   }

   .OwnsOne(e => e.Address, cb => cb.WithPrefix(""));
person Jeremy Lakeman    schedule 15.04.2020

Ответ Ивана Стоева из комментариев к вопросу:

Это должно быть сделано через соответствующий аргумент действия OwnsOne builder. например .OwnsOne(e => e.Address, cb => { cb.Property(e => e.Postcode).HasColumnName("Postcode"); });

(Сделайте это вики сообщества, просто пометив вопрос как ответ на него.)

person Community    schedule 28.03.2019