Entity Framework Split Table Удалить - PullRequest
13 голосов
/ 17 ноября 2011

Я использую EF 4 STE для моделирования объекта Attachment. Вложение содержит имя, описание, дату и, что наиболее важно, данные (byte[]). Чтобы оптимизировать загрузку, я не хочу получать свойство Data до тех пор, пока оно не станет абсолютно необходимым, то есть когда пользователь нажимает Download на клиенте.

Чтобы следовать этому подходу, я использовал технику разделения таблиц, описанную здесь . Я разделил мою таблицу Attachment на Attachment (Имя, Описание, Дата) и AttachmentData (Данные). Это отношение 1 к 1 в моей модели EF. Все прекрасно работает, пока я не попытаюсь удалить Attachment без AttachmentData (т.е. attachment.AttachmentData == null). Я получаю следующее исключение:

Обнаружены неверные данные. Требуемые отношения отсутствуют. Изучите StateEntries, чтобы определить источник нарушения ограничения.

Я видел аналогичный пост , но я не могу заставить его работать с STE и методом расширения ApplyChanges.

Прямо сейчас мой код доступа к данным прост: я вызываю контекст ApplyChanges(), за которым следует SaveChanges().

Я попробовал простую функцию удаления SQL и сопоставил ее с обеими сущностями, и это действительно сработало; однако это сломало вставку. Я не могу отобразить функцию вставки для всех свойств для обеих сущностей.

Какие-нибудь идеи по поводу других вариантов, которые я могу попробовать? Могут ли отношения между Attachment и AttachmentData быть необязательными? Когда я делаю это от 1 до 0+, я получаю ошибку отображения, говорящую, что Their primary keys may collide.

Открыт для любых предложений.

Спасибо!

1 Ответ

6 голосов
/ 18 ноября 2011

Решение похоже на связанный вопрос, но вы должны использовать особенность STE - ApplyChanges:

context.Attachments.ApplyChanges(att);
if (context.ObjectStateManager.GetObjectStateEntry(att).State == EntityState.Deleted)
{
    var data = new AttachmentData() {Id = att.Id};
    context.AttachmentDataSet.Attach(data);
    context.AttachmentDataSet.DeleteObject(data);
}
context.SaveChanges();
...