Самостоятельно отслеживаемые объекты - при удалении из свойства навигации не устанавливается состояние «Удалено» - PullRequest
2 голосов
/ 18 августа 2010

В конструкторе каждого из моих POCO у меня есть это:

this.StartTracking();

Чтобы гарантировать, что отслеживание включено для каждого экземпляра одного из моих POCO.У меня есть Entity A, который содержит TrackableCollection Entity B. Когда я загружаю свой экземпляр Entity A следующим образом:

using(MyContext ctx = new MyContext())
{
    entityA = ctx.EntityA.Include("EntityB").Where(x => x.Id== id).FirstOrDefault();
}

Глядя на свойство ObjectsAddedToCollection в Entity A, есть 1 объект, помеченный как «Не изменен».Когда я делаю entityA.EntityB [0] .MarkAsDeleted (), состояние не устанавливается на «Удалено» и перемещается в коллекцию ObjectsRemovedFromCollection.Это просто удаляется в целом.Я дважды проверил, и ChangeTrackingEnabled имеет значение True как для объекта A, так и для объекта B. Есть ли причина, по которой это не работает?Из-за этого я не могу удалить дочернюю сущность и сохранить изменения в базе данных.

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Это похоже на ошибку. В методе RecordRemovalFromCollectionProperties я изменил строку, которая просто возвращает:

if(((IObjectWithChangeTracker) value).ChangeTracker.State == ObjectState.Added)
    return;

Это исправило проблемы, которые у меня были.

0 голосов
/ 12 декабря 2010

Довольно опасно, хотя, изменяя этот сгенерированный код. Что делает метод RecordRemovalFromCollectionProperties, так это проверяет, есть ли добавленные объекты, которые снова удаляются (конечное состояние = нет добавленных или удаленных объектов, добавление и удаление "вычеркивают друг друга", видите ли ...?). Вот почему есть также RecordAdditionToCollectionProperties, который выполняет «обратную» проверку того, что я объяснил ранее.

Теперь, с вашим изменением в этом методе ChangeTracker, возможно, вы отправите EntityA с добавленным EntityB и удаленным EntityB (которые являются теми же экземплярами). Это может быть сделано пользователем или кодом в любом случае.

Я не знаю, позволит ли контекст объекта сначала это сделать. Но это по крайней мере немного неэффективно. Отправка обновленного EntityA, который сообщает контексту объекта (context.ApllyChanges(EntityA)) Добавьте этот EntityB и сразу после этого mwoah также удалит этот же EntityB;)

У меня есть некоторый опыт в этой области, так что если у вас есть дополнительные вопросы ...

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

...