Entity Framework не все обнаруживают изменения в модели - PullRequest
2 голосов
/ 11 июня 2019

Фон

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

Код

Мне удалось выявить проблему (хотя это может быть только правильное поведение) до этих строк.

Код в соответствующем методе:

db.SaveChanges(); //for sake of easy example, ensure no other changes need to be saved
Models.File file1 = db.ImportFiles.Find(FileId);
file1.FileData = new FileData();
db.SaveChanges(); //run SaveChanges override which has custom code for hashing content

Основной кусок кода переопределен SaveChanges():

public override int SaveChanges(){
    var updates = ChangeTracker.Entries().ToList();
    var updateHashQueue = new List<DbEntityEntry>();
    foreach (DbEntityEntry entry in updates.Where(x => (x.State == EntityState.Added || x.State == EntityState.Modified)))
    {
        updateHashQueue.Add(entry); //only the FileData object shows here, never the File object
    }
    base.SaveChanges(); //Later hashing needs IDs to exist
    HashObjects(updateHashQueue); //takes relevant objects to create hashes (these objects have a "Hash" field)
    return base.SaveChanges();
}

Объяснение

После изменения модели типа File, когда она содержит экземпляр FileData, Entity Framework ChangeTracker.Entries() содержит как объект FileData, так и объект File, но только первая находится в EntityState.Modified состояние, пока объект File отображается как EntityState.Unchanged.

Я думаю, что ответом на этот вопрос может быть просто то, что именно так оно и должно работать, но мне интересно, есть ли способ подобрать эти модели, как, например, File в этом примере, изменились таким образом.

Есть идеи?

1 Ответ

0 голосов
/ 11 июня 2019

Я почти уверен, что вам просто нужно позвонить:

db.SaveChanges();
Models.File file1 = db.ImportFiles.Find(FileId);
db.ImportFiles.Update(file1); //Added line
file1.FileData = new FileData();
db.SaveChanges(); 

Это сообщит объектной структуре, что вы хотите, чтобы устройство отслеживания изменений начало отслеживать состояние этих объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...