背景
我在重写的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
例如,已经以这种方式进行了更改。
有什么想法吗?
答案 0 :(得分:0)
我很确定你只需要打电话:
db.SaveChanges();
Models.File file1 = db.ImportFiles.Find(FileId);
db.ImportFiles.Update(file1); //Added line
file1.FileData = new FileData();
db.SaveChanges();
这将告诉entityframework,您希望变更跟踪程序开始跟踪该实体的状态。