【发布时间】:2019-06-11 17:04:40
【问题描述】:
背景
我在重写的 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();
}
说明
通过使其包含FileData 的实例来更改File 类型的模型,Entity Framework 的ChangeTracker.Entries() 包含FileData 对象和File 对象,但只有前者在@ 987654330@ 状态,而File 对象显示为EntityState.Unchanged。
我在想这个问题的答案可能只是这正是它的工作方式,但我想知道是否有一种方法可以通用地选择这些模型,比如这个例子中的File,以这种方式改变了。
有什么想法吗?
【问题讨论】:
-
您能否发布
SaveChanges()的覆盖代码,因为这可能是问题所在。 -
嗨,基兰,感谢您的建议。我在
SaveChanges的后半部分添加了一些额外的上下文,但我没有得到预期结果的主要部分似乎是ChangeTracker.Entries中的Unchanged状态File对象。 -
File对象永远不会改变,因为它在数据库中还不存在。 -
但是当我运行
db.ImportFiles.Find(FileId);时,我正在提取一个现有文件,不是吗? -
抱歉,我把
File和FileData搞混了。
标签: c# entity-framework