实体框架并不能全部检测模型上的更改

时间:2019-06-11 08:26:36

标签: c# entity-framework

背景

我在重写的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的实例,实体框架的ChangeTracker.Entries()包含FileData对象和File对象,但只有前者处于EntityState.Modified状态,而File对象显示为EntityState.Unchanged

我在想答案可能只是这就是它的工作方式,但我想知道是否有一种方法可以通用地选择该模型,例如其中的File例如,已经以这种方式进行了更改。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我很确定你只需要打电话:

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

这将告诉entityframework,您希望变更跟踪程序开始跟踪该实体的状态。