Создание ассоциации по непервичным ключевым полям с 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.
Ответы
Ответ 1
Это невозможно. Отношения в EF следуют точно таким же правилам, как в базе данных. Это означает, что главная таблица должна иметь уникальный идентификатор, на который ссылается зависимая таблица. В случае базы данных идентификатор может быть либо первичным ключом, либо уникальным столбцом (-ами) главной таблицы. В противном случае это неверное отношение.
Entity framework не поддерживает уникальные ключи. Если вы хотите иметь отношение "один ко многим" между Report
и RunStat
, ваша зависимая таблица (RunStat
) должна содержать столбец со значением Report.ReportKey
. Нет другого способа сделать его автоматическим - иначе вы должны просто сделать его настраиваемым и заполнить его из рамки сущности вручную, когда вам это нужно.