gpt4 book ai didi

c# - 覆盖 SaveChanges 并删除 EF 关系时为 null

转载 作者:太空狗 更新时间:2023-10-30 01:32:07 24 4
gpt4 key购买 nike

在我的多对一关系中,我试图删除其中一个子对象并在我覆盖的 SaveChanges 中保留审计线索。

在执行 EntityState.Modified 或 EntityState.Added 时,file.Entity.Product 不为空,但在执行 .Deleted 时,EF 似乎甚至在调用 base.Savechanges() 之前就积极地从实体中删除关系。

在我对文件(子)调用 .Remove 后,是否有任何方法可以检索此文件何时与我的 SaveChanges 覆盖相关联?

var files = from e in ChangeTracker.Entries<SavedFile>()
where e.State != EntityState.Unchanged
select e;
if (file.State == EntityState.Deleted)
{
var text = "File Deleted: " + file.Entity.FriendlyFileName;
// file.Entity.Product is null
var updatedProduct = new Update { Product = file.Entity.Product, UpdateDateTime = DateTime.Now, UpdateText = text, User = HttpContext.Current.Request.LogonUserIdentity.Name };
Updates.Add(updatedProduct);
}

最佳答案

正如您在 ChangeTracker 的条目中找到文件一样,您可以找到它的产品,假设 File 有一个外键关联 使用 Product,即除了 Product 导航属性外,它还有一个 ProductID 属性:

if (file.State == EntityState.Deleted)
{
var text = "File Deleted: " + file.Entity.FriendlyFileName;
var productEntry = ChangeTracker.Entries<Product>()
.FirstOrDefault(p => p.Entity.ID == file.ProductID);
if (productEntry != null)
{
var updatedProduct = new Update { Product = productEntry.Entity, UpdateDateTime = DateTime.Now, UpdateText = text, User = HttpContext.Current.Request.LogonUserIdentity.Name };
Updates.Add(updatedProduct);
}
}

只要实体是来自本地缓存的查询(例如 DbSet.Local),EF 就不会显示已删除的实体,这是预期的行为。因此它还必须打破关联以防止这些实体出现在导航属性中。如果您删除一个文件,EF 将不会在 context.Files.Local 中显示它,但它也不会在像 product.Files 这样的导航属性中可见(而且将关联的另一端,file.Product).

关于c# - 覆盖 SaveChanges 并删除 EF 关系时为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273340/

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