Подтвердить что ты не робот

Создание ассоциации по непервичным ключевым полям с API-интерфейсом Entity Framework 4.1 Fluent

Мы используем EF 4.1 и свободный API для получения данных из старой базы данных (не можем изменять базу данных). У нас возникла проблема создания связи между двумя таблицами, где соответствующие столбцы НЕ являются первичными и внешними ключами.

С приведенными ниже классами, как нам настроить отношение "один ко многим" между Report и RunStat таким образом, что Report.RunStats вернет все объекты RunStat, где поля ReportCode равны.

public class Report
{
  [Key]
  public int ReportKey { get; set; }
  public string Name { get; set; }
  public int ReportCode { get; set; } // Can we associate on this field
  public virtual ICollection<RunStat> RunStats { get; set; }
}

public class RunStat
{
  [Key]
  public int RunStatKey { get; set; }
  public int ReportCode { get; set; }
  public DateTime RunDate { get; set; }
}

В основном я хочу использовать Fluent API для настройки EF, чтобы думать, что Report.ReportCode - это ForeignKey и RunStat.ReportCode - это PrimaryKey.

4b9b3361

Ответ 1

Это невозможно. Отношения в EF следуют точно таким же правилам, как в базе данных. Это означает, что главная таблица должна иметь уникальный идентификатор, на который ссылается зависимая таблица. В случае базы данных идентификатор может быть либо первичным ключом, либо уникальным столбцом (-ами) главной таблицы. В противном случае это неверное отношение.

Entity framework не поддерживает уникальные ключи. Если вы хотите иметь отношение "один ко многим" между Report и RunStat, ваша зависимая таблица (RunStat) должна содержать столбец со значением Report.ReportKey. Нет другого способа сделать его автоматическим - иначе вы должны просто сделать его настраиваемым и заполнить его из рамки сущности вручную, когда вам это нужно.