Как сохранить дочернюю сущность в EntityFramework 4? - PullRequest
5 голосов
/ 15 апреля 2011

У меня 1-1 отношения между Заказами и Контактом. т.е. Contact.OrderId ссылается на Orders и также является PK.

Итак, у меня есть существующий Заказ, и я добавляю в него новый Контакт, как ...

    order.Contact = new Contact() { EmailAddress = "hello" };
    context.Orders.Attach(order);
    context.SaveChanges();

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

Так что я делаю не так?

Ответы [ 4 ]

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

Просто сгенерируйте свою дочернюю сущность, установите ее свойство OrderIdReference, и все будет хорошо.

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

У вас есть отношение 1 к 1 с общим первичным ключом в таблицах Order и Contact: PK контакта всегда должен совпадать с PK связанного заказа.Это имеет некоторые последствия:

  • Только один из столбцов PK в таблице Order и Contact может быть автоматически сгенерированным идентификатором.Я предполагаю, что это таблица Order.
  • Если у order уже был Contact до назначения нового, вы должны явно удалить старый контакт из базы данных, поскольку вы не можете иметь два контакта стот же OrderId, поскольку это одновременно PK.
  • Поскольку таблица Contact не имеет столбца идентификаторов, вы должны указать PK вручную в коде, и это должен быть PK заказа.

Чтобы сложить это, это может выглядеть так:

context.Orders.Attach(order);
if (order.Contact != null)
    context.DeleteObject(order.Contact);
order.Contact = new Contact() { OrderId = order.Id, EmailAddress = "hello" };
context.SaveChanges();

Это предполагает, что 1) старый order.Contact загружается в объект заказа, если ранее уже был КонтактВы назначаете новый и 2) что свойство OrderId из Contact является свойством PK.

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

Новый контракт не был добавлен:

context.Orders.Attach(order);
context.AddToContractSet(order.Contract);
context.SaveChanges();

Предполагается, что order уже находится в БД, и вы присоединяетесь, потому что он изначально пришел из другого контекста.Если нет, просто сделайте это:

context.AddToORdersSet(order);
context.SaveChanges();
0 голосов
/ 15 апреля 2011

Просто предположение, но я думаю, вам нужно установить pk для вашего контактного объекта. Entity Framework не нравится, когда у вас нет первичных ключей null.

...