gpt4 book ai didi

c# - Entity Framework 并非都检测到模型的变化

转载 作者:太空宇宙 更新时间:2023-11-03 14:41:41 25 4
gpt4 key购买 nike

背景

我在重写的 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 对象,但只有前者处于 EntityState.Modified 状态,而 File 对象显示为 EntityState.Unchanged

我在想这个问题的答案可能只是这正是它的工作方式,但我想知道是否有一种方法可以通用地获取这些模型,比如 File这个例子中的一个,已经以这种方式改变了。

有什么想法吗?

最佳答案

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

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

这将告诉 entityframework 您希望 changetracker 开始跟踪实体状态。

关于c# - Entity Framework 并非都检测到模型的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56539473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com