2013-12-04 3 views
1

По какой-то причине я заставил свой разум некоторое время вернуться к проекту EF 6, чтобы попытаться избежать именования внешних ключей. Я определил большую часть модели, не проверяя его постепенно и поэтому я бегу в многочисленности и проблем неполной Fluent определения API:Нарушения ограничения множественности с необязательно необходимым кодом EF Code First + Fluent?

Отношения от «User_InternalAuth» AssociationSet находится в состоянии «удалено». При заданных ограничениях множественности в состоянии «Удалено» должно также быть соответствующее значение «User_InternalAuth_Target».

В одном случае, вот код:

nModelBuilder.Entity<User>() 
    .HasOptional<InternalAuth>(u => u.InternalAuth) 
    .WithRequired(a => a.User) 
    .WillCascadeOnDelete(true); 

Я понимаю, что он говорит:

  • Лицо, User
  • имеет дополнительное свойство InternalAuth типа InternalAuth
  • На другом конце, InternalAuth имеет необходимое свойство User, так что всеInternalAuth s имеют User s, но User s может иметь или не иметь «InternalAuth.
  • Если User будет удален, так что делает его InternalAuth, если у него есть один (делает это переопределить необязательное поведение лечения УСТРОЙСТВА как nullables?)

Однако при попытке удалить User я получаю исключение о множественность некоторой связи между InternalAuth и User.

  1. Верно ли, что если EF понимает кратность отношений есть способ для того, чтобы обеспечить ему уникальное имя столбца для него, так что каноническое именования?

  2. Если да, то вам действительно нужно явно определять внешние ключи, аннотируя модель или через Fluent API?

  3. Если нет, стоит ли это целесообразно или желательно, чтобы я старался избежать этого? (Я подумываю о переносе модели данных, администрировании базы данных, любых причудах EF)

  4. Почему попытка удалить вышеупомянутое отношение нарушает ограничение множественности? Что еще нужно знать?

ответ

0

при условии, что

Вы можете настроить каскадное удаление в связи с использованием метода WillCascadeOnDelete. Если внешний ключ зависимого объекта не является нулевым, то Code First устанавливает каскадное удаление в отношении. Если внешний ключ на зависимом объекте является нулевым, Code First не устанавливает каскадное удаление в отношении, и когда основной пользователь удаляется, внешний ключ будет иметь значение null.

Мое предположение следующее: FK является нулевым, поэтому факт, чтобы установить его в нуль с требуемым ограничением, приводит к возникновению исключения.

Одним из решений является размещение FK в PK, то есть добавление в InternalAuth, FK пользователю в ПК. Выполнение этого будет означать, что сущность будет удалена при установке части его PK в нуль.