Почему TrackableCollection <T>не вызывает метод MarkAsDeleted для удаленного элемента? - PullRequest
1 голос
/ 30 июня 2011

У меня проблема при использовании объектов самопроверки при компоновке WPF.

У меня есть две сущности, установленные для примера: Люди и Числа. У каждого человека есть много чисел, и у многих чисел может быть человек.

Вот пример кода, который я ожидаю удаления номера:

using (var db = new Model.SampleEntities())
{
    list = db.People.Include("Numbers").ToList();
}

var samplePerson = list[0];
samplePerson.StartTracking();
var number = samplePerson.Numbers.First();
p.Numbers.Remove(number);

using (var db = new Model.SampleEntities())
{
    foreach (Model.Person person in list)
    {
        db.People.ApplyChanges(person);
    }
    db.SaveChanges();
}

Не удаляет номер из БД.

Когда я изменяю класс TrackableCollection (который создается шаблонами Self-Tracking T4) путем переопределения метода RemoveItem и добавления следующего кода, он работает, как я ожидал:

protected override void RemoveItem(int index)
{
    var entity = ((IObjectWithChangeTracker)this[index]);
    base.RemoveItem(index);
    entity.MarkAsDeleted();
}

Правильно ли я помещаю здесь метод MarkAsDeleted? Поэтому я должен изменить файл TT, чтобы поместить этот код в класс TrackableCollection. Это хороший подход?

1 Ответ

2 голосов
/ 30 июня 2011

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

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

...