Навигационные свойства в EF41 с кодом сначала без внешнего ключа? - PullRequest
0 голосов
/ 22 октября 2011

Можно ли создать / отобразить навигационные свойства в EF41 сначала с помощью кода, без использования внешнего ключа? В моем случае это нужно для историзации:

public class Person
{
 public virtual Guid ID { get; set; }
 public virtual string Name { get; set; }
 public virtual IList<PersonHist> History { get; set; }
}

public class PersonHist
{
 public virtual Guid ID { get; set; }
 public virtual Guid PersonID { get; set; }
 public virtual string Name { get; set; }
}

Представьте себе: Person был изменен несколько раз, поэтому в Person есть одна запись, а в PersonHist - N исторических записей. Теперь я удаляю Person, поэтому Person не должен иметь этого Person, а PersonHist теперь имеет еще одну запись. Но это невозможно с внешним ключом ... (Я не хочу удалять флажок / столбец в Person !, но мне нужно свойство навигации от Person to PersonHist ...)

1 Ответ

0 голосов
/ 22 октября 2011

Логика навигационных свойств основана на внешних ключах. Поэтому, если вы хотите отобразить его и использовать в качестве свойства навигации, вы должны иметь внешний ключ в PersonHist. Вы можете сделать ключ обнуляемым, но вам придется правильно его использовать:

  • Изменить отображение, чтобы удалить каскадное удаление, используемое по умолчанию
  • Установите нулевое значение для всех связанных PersonHist перед удалением Person или реализуйте пользовательский инициализатор базы данных и замените ссылочное ограничение на ON DELETE SET NULL

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

...