Entity Framework 4.0 и самообращающиеся таблицы;.SaveChanges () завершается ошибкой .AddObject () - PullRequest
2 голосов
/ 15 апреля 2011

РЕЗЮМЕ ПРОБЛЕМЫ:

При использовании самоссылающихся отношений и попытке добавления объектов происходит сбой .SaveChanges () с «Не удается определить основной конец отношения« PlannerModel.FK_PlanItem_PlanItem ».У нескольких добавленных объектов может быть один и тот же первичный ключ. ».

ДЕТАЛИ ПРОБЛЕМЫ:

plannerContext = new PlannerEntities2();

var unitPlanQuery = from d in plannerContext.UnitPlans 
                    where d.TeacherId == sourceTeacherId
                    orderby d.TeacherId
                    select d;

var planItem = new PlanItem();
ClonePlanItem(pi, planItem); // where pi is original PlanItem

planItem.ParentPlanItem = (PlanItem)planItemsAddedHT[pi.ParentPlanItemId];

// above object on right is the previously added PlanItem

plannerContext.PlanItems.AddObject(planItem);

plannerContext.SaveChanges();

Я вернулся к своему коду и прокомментировал его так, что я точно знал только один вызовto 'plannerContect.PlanItems.AddObject (planItem)' происходило.Таким образом, был только один объект для вставки.Сообщение об ошибке изменилось на:

«Невозможно определить действительный порядок для зависимых операций.Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или сгенерированных хранилищем значений ».

Я вернулся и добавил« Разрешить пустые значения »в столбец ParentPlanItemId в SQL Management Studio (кстати, SQL Server 2008) иобновил мою модель ... но это ничего не изменило.

Таблица: PlanItem


PlanItem int PK, удостоверение личности

ParentPlanItemID int, allow null

ItemText varchar (200)

Ссылочное ограничение от дизайнера моделей: Principal = PlanItem;Основной ключ = PlanItemId;Зависимое свойство = ParentPlanItemId

Ассоциация от дизайнера моделей:

Имя набора ассоциаций: FK_PlanItem_PlanItem

End1 Multipllicity: 1 (один из PlanItem)

End1 Навигационная поддержка:PlanItem1

End2 Множественность: * (Коллекция PlanItem)

End2 Nav: ParentPlanItem

Имя: FK_PlanItem_PlanItem

Ответы [ 2 ]

0 голосов
/ 19 апреля 2011

Оказывается, установка родительского свойства, как я делал, не была проблемой. Для таблицы с самоссылкой, подобной этой, кратность должна быть (ноль или 1), а свойство ParentPlanItemId должно разрешать пустые значения.

Приветствую всех!

0 голосов
/ 15 апреля 2011

Вы пытались установить свойство

planItem.ParentPlanItemReference

напрямую?

Вы бы на самом деле установили для него определенный идентификатор элемента плана (который у вас уже был ранее, как я вас понял), который ужесуществует в БД.Я не говорю, что это сработает, но стоит попробовать.Я использовал эти *Reference свойства несколько раз, чтобы ускорить процесс при вставке, а иногда и при чтении.

Проверьте эту запись в блоге для дальнейшего использования.

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