Я пытаюсь упростить свой код и перенесу часть базовой логики на сами сущности 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);
Это кажетсяотвратительно, но работает.Конечно, делать это не может быть правильным путем?