Создание связи на полях неосновного ключа с помощью Entity Framework 4.1 Fluent API - PullRequest
15 голосов
/ 11 августа 2011

Мы используем 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 как внешний ключ и RunStat.ReportCode как первичный ключ.

Ответы [ 2 ]

11 голосов
/ 11 августа 2011

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

Платформа сущностей не поддерживает уникальные ключи.Если вы хотите иметь отношение «один ко многим» между Report и RunStat, ваша зависимая таблица (RunStat) должна содержать столбец со значением Report.ReportKey.Другого способа сделать его автоматическим не существует - в противном случае вы должны просто сделать его настраиваемым свойством и вручную заполнить его из структуры сущностей, когда вам это нужно.

1 голос
/ 01 ноября 2018

Эта возможность теперь возможна в EF Core 1.0 (EF7), как указано в ссылке, предоставленной @ Brian 16 июля 2014 г. на запрос , отправленный Форум Microsoft UserVoice .

Чтобы эта ценная информация не была потеряна, если эта информация исчезнет на указанной странице, вот текст запроса функции:

Поддержка уникальных ограничений (т. Е. Ключа-кандидата)
(опубликовано Кати Айсвой 10 сентября 2010 г.)

SQL Server и другие базы данных поддерживают уникальные ограничения на таблицы. Ограничения внешнего ключа обычно основаны на уникальных ограничениях основная сторона, причем первичный ключ является лишь частным случаем уникальное ограничение. Entity Framework в настоящее время поддерживает только основаны на ссылочных ограничениях на первичных ключах и не имеют Понятие уникального ограничения. Идея состоит в том, чтобы иметь:

  • Поддержка указания уникального ограничения для сущности
  • Поддержка указания ассоциаций внешнего ключа, которые на основном конце указывают столбцы, которые содержат уникальное ограничение, но не первичный ключ.

И заявление Microsoft о реализации этой возможности в EF Core 1.0:

Завершено
(опубликовано Диего Вега (руководитель программы, Microsoft Entity Framework) 9 августа 2016 г.)

Закрытие, поскольку поддержка этой функции была добавлена ​​в EF Core 1.0, и мы у нас нет планов добавлять его в кодовую базу EF6. Также, пожалуйста, создайте новые идеи для конкретных улучшений этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...