gpt4 book ai didi

c# - 在 Entity Framework 6.1.3 中调用 SaveChanges 时获取实体名称

转载 作者:行者123 更新时间:2023-11-30 20:30:43 25 4
gpt4 key购买 nike

我试图覆盖我的 DbContext 类中的 SaveChanges() 方法,这是因为我试图获取添加、删除或删除行的实体的名称更新了行的相应 ID 和执行的操作。

我不知道该怎么做。

这是为了记录操作目的。

提前问好。

最佳答案

您需要重写 DbContext 的 SaveChanges 方法,并使用 ChangeTracker 在将实体保存到 database.public 之前跟踪对实体所做的更改

public class ChangeLog  
{
public string EntityName { get; set; }
public string PropertyName { get; set; }
public string OldValue { get; set; }
public string NewValue { get; set; }
}

public override int SaveChanges()
{
var modifiedEntities = ChangeTracker.Entries()
.Where(p => p.State == EntityState.Modified).ToList();

foreach (var change in modifiedEntities)
{
var entityName = change.Entity.GetType().Name;

foreach(var prop in change.OriginalValues.PropertyNames)
{
var originalValue = change.OriginalValues[prop].ToString();
var currentValue = change.CurrentValues[prop].ToString();
if (originalValue != currentValue)
{
ChangeLog log = new ChangeLog()
{
EntityName = entityName,
PropertyName = prop,
OldValue = originalValue,
NewValue = currentValue,
};
ChangeLogs.Add(log);
}
}
}
return base.SaveChanges();
}

在上面的代码片段中,我们查询了更改跟踪器 api 以获取已修改的实体

var modifiedEntities = ChangeTracker.Entries()
.Where(p => p.State == EntityState.Modified).ToList();

您可以使用相同的方式查询添加和删除的实体。

编辑

object GetPrimaryKeyValue(DbEntityEntry entry)  
{
var stateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
return stateEntry.EntityKey.EntityKeyValues[0].Value;
}

注意:如果您将“标识插入”设置为“打开”,则上述代码段将无法用于添加的实体。

关于c# - 在 Entity Framework 6.1.3 中调用 SaveChanges 时获取实体名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403388/

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