- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从网上找到的代码片段中编写审计跟踪。在调用我的 SaveChanges 函数时,我会遍历所有在上下文中注册的修改过的实体,并从它们的更改中构建日志条目。
foreach (DbEntityEntry modifiedEntity in this.ChangeTracker.Entries().Where(p => p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted || p.State == System.Data.EntityState.Modified))
{
// For each changed record, get the audit record entries and add them
foreach(AuditLog x in GetAuditRecordsForChange(modifiedEntity, userId))
{
this.AuditLog.Add(x);
}
}
ToObject()
以原始状态构建对象,但显然复杂的属性都是空值。
modifiedEntity.OriginalValues.ToObject()
ToObject()
之后显示为代理。调用而(我不知道为什么)但是那些没有由实体为它们创建的代理,它们的复杂属性填充得很好。当我在整个应用程序中正常使用 POCO 代理时,延迟加载在它们上运行良好。
最佳答案
要获取实体的所有成员名称,而不仅仅是您可以使用的简单属性 ObjectContext
而不是 DbContext
然后通过 EntityType
访问成员列表.
((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(dbEntry).EntitySet.ElementType.Members
Gets an object that represents a member of the entity. The runtime type of the returned object will vary depending on what kind of member is asked for. The currently supported member types and their return types are Reference navigation property (DbReferenceEntry), Collection navigation property (DbCollectionEntry), Primitive/scalar property (DbPropertyEntry) and Complex property (DbComplexPropertyEntry).
private IEnumerable<AuditLogEntry> GetAuditLogEntries(DbEntityEntry dbEntry)
{
if (dbEntry.State == EntityState.Added)
{
return new AuditLogEntry { ... };
}
if (dbEntry.State == EntityState.Deleted)
{
return new AuditLogEntry { ... };
}
if (dbEntry.State == EntityState.Modified)
{
// Create one AuditLogEntry per updated field.
var list = new List<AuditLogEntry>();
// We need to object state entry to do deeper things.
ObjectStateEntry objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(dbEntry);
// Iterate over the members (i.e. properties (including complex properties), references, collections) of the entity type
foreach (EdmMember member in ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(dbEntry).EntitySet.ElementType.Members)
{
var dbMemberEntry = dbEntry.Member(member.Name) as DbPropertyEntry;
if (dbMemberEntry == null || Equals(dbMemberEntry.OriginalValue, dbMemberEntry.CurrentValue))
{
// Member entry isn't a property entry or it isn't modified.
continue;
}
string oldValue;
string newValue;
if (dbMemberEntry is DbComplexPropertyEntry)
{
// Bit a bit lazy here and just serialise the complex property to JSON rather than detect which inner properties have changed.
var complexProperty = (DbComplexPropertyEntry)dbMemberEntry;
oldValue = EntitySerialiser.Serialise(complexProperty.OriginalValue as IAuditableComplexType);
newValue = EntitySerialiser.Serialise(complexProperty.CurrentValue as IAuditableComplexType);
}
else
{
// It's just a plain property, get the old and new values.
var property = dbMemberEntry;
oldValue = property.OriginalValue.ToStringOrNull();
newValue = property.CurrentValue.ToStringOrNull();
}
list.Add(new AuditLogEntry
{
...,
EventType = AuditEventType.Update,
ColumnName = member.Name,
OriginalValue = oldValue,
NewValue = newValue
});
}
return list;
}
// Otherwise empty.
return Enumerable.Empty<AuditLogEntry>();
}
关于entity-framework - DbEntityEntry.OriginalValues 不填充复杂属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7022721/
这个问题在这里已经有了答案: Entity Framework DbContext SaveChanges() OriginalValue Incorrect (6 个答案) 关闭 4 年前。 我正
我正在从网上找到的代码片段中编写审计跟踪。在调用我的 SaveChanges 函数时,我会遍历所有在上下文中注册的修改过的实体,并从它们的更改中构建日志条目。 foreach (DbEntityEnt
如何将ObjectStateEntry.OriginalValues转换为Entity?我认为我可以使用 ObjectContext.Translate 方法来做到这一点,但我必须传递 DataRea
我正在尝试覆盖 Entity Framework 的 SaveChanges() 方法来保存审计信息。我从以下内容开始: public override int SaveChanges() {
我正在编写一个 asp.net mvc4 应用程序,我正在使用 Entity Framework 5。我的每个实体都有像 EnteredBy、EnteredOn、LastModifiedBy 0)
下面是String类的构造函数 public String(String original) { int size = original.count; char[] originalValue = o
我正在尝试使用 EF 4.1 实现 AuditLog,方法是重写在以下位置讨论的 SaveChanges() 方法: http://jmdority.wordpress.com/2011/07/20/
我在 EF7/asp.Net Core 应用程序中遇到问题。在我的上下文中,我创建了一个保存方法: public int Save() { ChangeTracker.
我的代码看起来很简单: bool rv = false; var results = from user in Users where user.userName.Equals
我正在使用 Entity Framework 4.1,并且我有我的 DbContext Override SaveChanges 来审核属性更改。从“GetEntryValueInString”返回空
我在更新 EF Core 中的实体然后在表中记录这些更改时遇到了问题。使用的技术是: .NET 核心 2.2.0 EF 核心 2.2.3 所以,我想从数据库中获取一个实体,在前端对其进行编辑,然后在后
我对 Entity Framework 还很陌生。作为了解更多关于 EF 的入门者,我正在尝试按照 http://genericunitofworkandrepositories.codeplex.c
我有一个文档库站点,我想在编辑文档对象时发送一封包含更改摘要的电子邮件。 数据库交互是使用 DBContext 的 Code First Entities Framework 这是我目前所拥有的:
我有一个文档库站点,我想在编辑文档对象时发送一封包含更改摘要的电子邮件。 数据库交互是使用 DBContext 的 Code First Entities Framework 这是我目前所拥有的:
在字符串构造函数的代码中 - public String(String original) { int size = original.count; char[] originalVa
好吧,这个问题对我来说似乎非常奇怪。我有一个用于编辑和创建新文章的 View 。编辑现有文章非常有效,但是创建新文章会给我一个空引用异常(“对象引用未设置为对象的实例”)。 这是我的代码: //Ret
我是一名优秀的程序员,十分优秀!