我正在课堂上实施一些通用审核。我想要的是将一个实体从上下文中分离出来并序列化它,并将序列化实体的JSON字符串保存在我的审计逻辑中。但由于某些对象有引用,显然序列化因此失败。所以我实现了逻辑设置为所有class.PropertyType.IsGenericType
的null并且工作正常。但是在创建我的审计日志并调用context.SaveChanges
之后,它保存了我取消设置某些属性更改的实体,即使我确实将其从上下文中分离出来。
无论如何,我可以使这段代码有用吗?
注意:newItem实际上仍被上下文跟踪...
context.Entry<T>( newItem ).State = System.Data.Entity.EntityState.Detached;
context.SaveChanges();
var props = newItem.GetType().GetProperties().Where( p => p.PropertyType.IsGenericType );
foreach ( var item in props )
{
item.SetValue( newItem, null );
}
AuditLog log = new AuditLog()
{
CreatedOn = DateTime.Now,
ModifiedOn = DateTime.Now,
Type = ( Int32 ) activity,
ActionTable = newItem.GetType().Name,
Userid = ( ( CurrentUser != null ) ? CurrentUser.Id : 0 ),
AfterImage = new JavaScriptSerializer().Serialize( newItem ),
ModifiedBy = ( ( CurrentUser != null ) ? CurrentUser.Email : "System" ),
Comments = String.Format( "Created a new {0}", newItem.GetType().Name ),
BeforeImage = ( oldItem != null ) ? new JavaScriptSerializer().Serialize( oldItem ) : String.Empty,
ObjectId = ( Int32 ) newItem.GetType().GetProperties().FirstOrDefault( x => x.Name == "Id" ).GetValue( newItem ),
Parameters = new JavaScriptSerializer().Serialize( HttpContext.Current.Request.RequestContext.RouteData.Values )
};
context.Logs.Add( log );
context.SaveChanges(); // When I execute this, the changes in the foreach loop are saved for that newItem
提前致谢。