EF Core 3.0 1: 0 отношения с свободно - PullRequest
1 голос
/ 11 февраля 2020

EF Core 3.0 ... Я не могу найти точный ответ для этого полностью нормального сопоставления.
Принципал к Зависимости без обратного указателя на Принципала, отношение 1: 0, настроена таблица Тип / Объект поиска. Проблема состоит в том, что имя ключа объекта «RunId» отличается от имени ключа, сгенерированного EFCore «ServiceRunId»

Как использовать Fluent API для замены аннотации [ForeignKey ("aServiceRun")]?

Это моя текущая настройка Fluent, но я не знаю, куда поместить отображение ForeignKey.

aBuilder.Entity (). HasKey (новая строка [ ] {"RunId"});

aBuilder.Entity (). HasOne (s => s.aServiceRun);


Class Service {        
  public int ServiceId {get; set;}

  [ForeignKey("aServiceRun")]
  public int RunId { get; set; }

  public virtual ServiceRun aServiceRun { get; set; }
}

Class ServiceRun {
  public int RunId { get; set; }

  public string description {get ;set; }
}

Таблицы:

Service {
  ServiceId int

  RunId int
}

SerivceRun {
  RunId int

  Description string
}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Я нашел ответ на вышеупомянутую проблему - у меня был обратный список в моем объекте ServiceRun, который не был настроен или проигнорирован. Я решил оставить это здесь как еще один пример. Возможно, это принесет кому-то какую-то ценность.

Это 1: 0 от Service до ServiceRunType, где имена таблиц и имена свойств / полей не совпадают идеально.

Таблицы

ServiceRun { //Does not match object name
int Id, 
string Desc
}
Service {
int Id, 
int RunId //Does not match object
}

Объекты

Class ServiceRunType{  //Does not match table name
public int Id {get; set;} 
public String Desc {get; set;}
}
Class Service{
public int Id {get; set;} 
public int RunTypeId {get; set;} //Does not match table
public virtual ServiceRunType aServiceRunType { get; set; }
}

Свободный код

modelBuilder.Entity<ServiceRunType>()
.ToTable("ServiceRun", schema: "load")
.HasKey(new string[] { "Id" });
modelBuilder.Entity<Service>()
.ToTable("Service", schema: "load") //Had to specify schema
.HasKey(new string[] { "Id" });
modelBuilder.Entity<Service>()
.Property("RunTypeId")
.HasColumnName("RunId");
modelBuilder.Entity<Service>()
.HasOne(s => s.aServiceRunType)
.WithOne()
.HasForeignKey<Service>(s => s.RunTypeId);
0 голосов
/ 12 февраля 2020

Как использовать Fluent API для замены аннотации [ForeignKey("aServiceRun")]?

Вы ищете HasForeignKey свободный API. Но для того, чтобы получить доступ к нему (и другим API-интерфейсам конфигурации отношений), вам нужно определить отношение с помощью Has{One|Many}, за которым следует With{One|Many}. Для отношений один-к-одному необходимо также предоставить аргумент типа c для HasForeignKey:

При настройке отношения с помощью Fluent API вы используете методы HasOne и WithOne.

При настройке внешнего ключа необходимо указать тип зависимого объекта - обратите внимание на параметр generi c, предоставленный для HasForeignKey в приведенном ниже листинге. В отношении «один ко многим» ясно, что объект с эталонной навигацией является зависимым, а объект с коллекцией - основным. Но это не так в отношении один-к-одному - отсюда необходимость явного его определения.

Обратите внимание, что объект, содержащий FK, всегда зависит , поэтому для вашей модели ServiceRun является основным, Service является зависимым, а конфигурация беглого выглядит следующим образом:

modelBuilder.Entity<Service>()
    .HasOne(s => s.aServiceRun) // navigation property
    .WithOne() // no navigation property
    .HasForeignKey<Service>(s => s.RunId); // foreign key
...