Удаление объекта коллекции из метода EF4 - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь упростить свой код и перенесу часть базовой логики на сами сущности Entity Framework (похоже, именно поэтому у нас есть сущности, которые моделируют бизнес-логику).В настоящее время сущности - это просто набор свойств и коллекций.

Я смотрю на наличие функции на сущности, которая удаляет элемент из коллекции и добавляет его в другую коллекцию на сущности.

Теперь функция добавления в другую коллекцию работает отлично.Однако удалить - удаляет элемент из коллекции, но не удаляет его.

Я получаю:

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

Я понимаю, что это потому, что удаление из коллекции на самом деле не помечает для удаления, а когда происходят изменения сохранения контекста, оно расстраивается из-за того, что ключ обнуляется, но не помечается для удаления.Поскольку я не в хранилище и не имею доступа к контексту внутри.Как я должен сообщить контексту, что этот элемент нужно удалить?

Я думал, что должен был убедиться, что сущности домена инкапсулировали соответствующую бизнес-логику.Это просто неправильная вещь?Как я могу обойти это?Должен ли я обойти это?

Если я использую метод расширения:

public static ObjectContext GetContext(this IEntityWithRelationships entity)
{
    if (entity == null)
        throw new ArgumentNullException("entity");

    var relationshipManager = entity.RelationshipManager;

    var relatedEnd = relationshipManager.GetAllRelatedEnds()
                                        .FirstOrDefault();

    if (relatedEnd == null)
        throw new Exception("No relationships found");

    var query = relatedEnd.CreateSourceQuery() as ObjectQuery;

    if (query == null)
        throw new Exception("The Entity is Detached");

    return query.Context;
}

Я могу получить доступ к контексту внутри сущности следующим образом:

var context = this.GetContext() as Entities;
context.events.DeleteObject(event);

Это кажетсяотвратительно, но работает.Конечно, делать это не может быть правильным путем?

1 Ответ

0 голосов
/ 07 марта 2012

Я изменил модели, чтобы сделать отношения между родительскими и дочерними идентификаторами, идентифицируя отношения, используя составной ключ, содержащий ключ родителей.Это означает, что удаление сущности из дочерней коллекции удаляет ее, не требуя доступа к контексту.См. Этот вопрос Можно ли удалить дочерний элемент из коллекции и решить проблемы в SaveChanges?

...