Удалить объект в EF4, не загружая весь объект - PullRequest
2 голосов
/ 08 апреля 2011

Я использую Entity Framework 4 и имею следующие настройки и проблемы.

У меня есть таблица в MySql с полями метаданных и полем BLOB-объектов.Используя метод разделения таблицы, описанный здесь , я разделил таблицу на две сущности (DataItem и DataItemDetails).Таким образом, я могу загрузить все метаданные без загрузки BLOB-объектов.

Проблема в том, что при попытке удалить объект dataitem я получаю следующее исключение:

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

Если я перехожу на Lazy Loading или загружаю часть DataItemDetail, я могу удалить DataItem.

Это нормально, но я не хочу загружать данные только для того, чтобы удалить их.

if (!D.DataItemDetailReference.IsLoaded)
     D.DataItemDetailReference.Load();
_db.DataItems.DeleteObject(d);
_db.SaveChanges();


_db is the ObjectContext dereived class and D is an instance of the DataItem class.

Ответы [ 3 ]

6 голосов
/ 10 апреля 2011

Если вы не хотите загружать свойство, вы должны обмануть EF, чтобы он считал, что соответствующая DataItemDetail загружена.

var detailItem = new DataItemDetail { Id = d.Id }; 
_db.DataItemDetails.Attach(detailItem);
_db.DataItems.DeleteObject(d);
_db.SaveChanges();

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

1 голос
/ 14 мая 2011

Спасибо, Ладислав и Маркус! Это именно то, что мне было нужно. Чтобы сделать это в Entity Framework 4.1 с базой данных сначала, мне пришлось изменить это следующим образом:

If _db.Entry(d).Reference(Function(e) e.DataItemDetails).IsLoaded() = False Then
     Dim detailItem = New DataItemDetails With { .ID = d.ID }
     _db.DataItemDetails.Attach(detailItem)
End If
_db.DataItems.Remove(d)
_db.SaveChanges()
0 голосов
/ 08 апреля 2011

Есть ли причина, по которой вы не можете позвонить сохраненному процессу?MEF должен с этим справиться, и вы будете в порядке и быстро передадите ID хранимому процессу, где вы сможете делать с данными то, что вам нравится.

Извините ... отредактируйте, чтобы сказать, я знаю, что это не отвечает на вопрос "как с EF4", но если вы застряли, это довольно жизнеспособное решение (и его легко реализовать тоже)).Приветствия.

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