Entity Framework 6 Записи ChangeTracker все неизменны, несмотря на удаление объекта из коллекции навигации - PullRequest
2 голосов
/ 01 июля 2019

Я перезаписываю свой метод DbContext SaveChanges и записываю записи ChangeTracker.

public override int SaveChanges()
{
    var entries = ChangeTracker.Entries();
    return base.SaveChanges();
}

У меня есть объект под названием «Диапазон», который имеет свойство навигации для другого объекта под названием «Элемент»

public class Range
{
    //other code
    public virtual ICollection<Feature> Features { get; set; }
}

Я удаляю элемент из диапазона и затем сохраняюизменения

var featureToRemove = range.Features.First(f => f.ID == featureId);
range.Features.Remove(featureToRemove);
centralProducts.SaveChanges();

После вызова этого кода функция успешно удалена, но все записи в ChangeTracker имеют EntityStatus неизменен (не только рассматриваемый объект диапазона).

Что-тоизменение или база данных не будет обновлена.

Есть ли способ зафиксировать это изменение в методе SaveChanges?Действительно ли «Без изменений» будет состояние, которое я ожидаю увидеть при удалении чего-либо из свойства навигации?

Я знаю, что фактически измененная таблица называется Range_Features и не является ни Range, ни самой функцией.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Как уже говорилось, EF отслеживает изменения в отношениях.Я смог зафиксировать эти изменения, используя следующие методы расширения

public static class IaExtensions
{
    public static IEnumerable<Tuple<object, object>> GetAddedRelationships(
    this DbContext context)
    {
        return GetRelationships(context, EntityState.Added, (e, i) => e.CurrentValues[i]);
    }

    public static IEnumerable<Tuple<object, object>> GetDeletedRelationships(
    this DbContext context)
    {
        return GetRelationships(context, EntityState.Deleted, (e, i) => e.OriginalValues[i]);
    }

    private static IEnumerable<Tuple<object, object>> GetRelationships(
    this DbContext context,
    EntityState relationshipState,
    Func<ObjectStateEntry, int, object> getValue)
    {
        context.ChangeTracker.DetectChanges();
        var objectContext = ((IObjectContextAdapter)context).ObjectContext;

        return objectContext
        .ObjectStateManager
        .GetObjectStateEntries(relationshipState)
        .Where(e => e.IsRelationship)
        .Select(
            e => Tuple.Create(
                objectContext.GetObjectByKey((EntityKey)getValue(e, 0)),
                objectContext.GetObjectByKey((EntityKey)getValue(e, 1))));
    }
}

См. этот ответ для получения более подробной информации

1 голос
/ 01 июля 2019

EF отслеживает изменения как сущностей, так и отношений, но DbContext имеет только API для отображения записей отслеживания изменений для сущностей.Когда вы изменяете отношение, оно будет реализовано с помощью UPDATE или DELETE, в зависимости от типа отношения.

Но да, в этом сценарии обе сущности, участвующие в отношении «многие ко многим», не изменились.

...