asp.net - 获取添加的实体状态主键 Asp.Net 实体框架
问题描述
我正在尝试通过覆盖 dbcontext SaveChanges() 方法来创建更改跟踪器。
添加状态时我无法获取实体的主键。
尝试保存 ChangeLog 时如何获得添加的实体状态。
DbContext 覆盖的 SaveChanges 是这样的:
public override int SaveChanges()
{
var adddedEntites = ChangeTracker.Entries().Where(p => p.State == EntityState.Added).ToList();
var now = DateTime.UtcNow;
foreach (var added in adddedEntites)
{
var entityName = added.Entity.GetType().Name;
foreach (var prop in added.CurrentValues.PropertyNames)
{
var currentValue = added.CurrentValues[prop].ToString();
var id = new Guid();
ChangeLog log = new ChangeLog()
{
Id = id,
EntityName = entityName,
PrimaryKeyValue = null// how can I get pkey,
PropertyName = prop,
NewValue = currentValue,
DateChanged = now,
ActionType = "A"
};
ChangeLogs.Add(log);
}
}
return base.SaveChanges()
}
谢谢。
解决方案
由于主键设置在 中base.SaveChanges
,您可以在调用后获取它,例如(使用反射):
public override int SaveChanges()
{
var addedEntities = ChangeTracker.Entries().Where(p => p.State == EntityState.Added).ToList();
var result = base.SaveChanges();
foreach (var added in addedEntities)
{
var idInfo = added.Entity.GetType().GetProperty("Id");
var id = idInfo.GetValue(added.Entity);
}
return result;
}
推荐阅读
- c++ - 为什么我不能创建一个包含 vec3 对象的联合?
- javascript - 如何解决无法在“节点”上执行“removeChild”?
- javascript - React js applicationd不要将数据添加到表中
- android - 在片段 getActivity() 与 mActivity 参考中显示 toast
- swift - 如何将标签栏添加到不在标签栏菜单中的其他页面
- git - 找不到远程存储库 - 但可以在浏览器中访问 Stash
- http - 通过 HTTP 的 VLC HTTP 流总是在 10 秒后停止
- javascript - 循环遍历可点击元素列表并将 html 写入相应的文件
- mysql - MySQL加载数据infile错误并附上
- visual-studio-code - funcList 自定义语言的 Visual Studio 代码正则表达式