C# 在实体框架DbContext中使用Newtonsoft.Json时,不会解析成员异常的类型
在我的C# 在实体框架DbContext中使用Newtonsoft.Json时,不会解析成员异常的类型,c#,.net,json,entity-framework,json.net,C#,.net,Json,Entity Framework,Json.net,在我的DbContext类中,我刚刚添加了对Newtonsoft.Json的一些引用,因为我正在使用它存储实体的序列化版本以供审核 现在,当我运行updatedatabase命令时,我在控制台中得到以下信息 指定'-Verbose'标志以查看应用于目标数据库的SQL语句。 没有挂起的显式迁移。 运行种子法 System.Runtime.Serialization.SerializationException:未解析成员“Newtonsoft.Json.JsonSerializationExcep
DbContext
类中,我刚刚添加了对Newtonsoft.Json
的一些引用,因为我正在使用它存储实体的序列化版本以供审核
现在,当我运行updatedatabase
命令时,我在控制台中得到以下信息
指定'-Verbose'标志以查看应用于目标数据库的SQL语句。没有挂起的显式迁移。
运行种子法 System.Runtime.Serialization.SerializationException:未解析成员“Newtonsoft.Json.JsonSerializationException,Newtonsoft.Json,Version=7.0.0.0,Culture=neutral,PublicKeyToken=30AD4FE6B2A6EED”的类型。
在System.AppDomain.docCallback(CrossAppDomainDelegate callBackDelegate)
位于System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner运行程序)
位于System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串targetMigration,布尔值force)
在System.Data.Entity.Migrations.UpdateDatabaseCommand.c_uuDisplayClass2.b_uu0()中 位于System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作命令) 未解析成员“Newtonsoft.Json.JsonSerializationException,Newtonsoft.Json,版本=7.0.0.0,区域性=中性,PublicKeyToken=30AD4FE6B2A6EED”的类型 所有引用都很好,
Newtonsoft.Json
dll位于输出目录中
有人知道如何让它工作吗
谢谢
史蒂夫
编辑:
公共EFDbContext(字符串名称或连接字符串=“DbConnectionString”):基(名称或连接字符串)
{
IObjectContextAdapter=this;
adapter.ObjectContext.SavingChanges+=objectcontextsonsavingchanges;
}
///
///审核记录。
///
///对象上下文。
公共作废审核记录(ObjectContext ObjectContext)
{
IEnumerable changes=objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified);
foreach(更改中的ObjectStateEntry StatentryEntity)
{
如果(!statentryEntity.IsRelationship&&statentryEntity.Entity!=null&&!(statentryEntity.Entity是AuditEntry))
{
AuditEntry audit=CreateAuditRecord(stateEntryEntity,objectContext);
this.AuditEntries.Add(审核);
}
}
}
///
///创建审核记录。
///
///对象状态条目。
///对象上下文。
///审计条目。
public AuditEntry CreateAuditRecord(ObjectStateEntry ObjectStateEntry,ObjectContext ObjectContext)
{
AuditEntry audit=新的AuditEntry();
audit.TableName=objectStateEntry.EntitySet.Name;
audit.applicationSerid=用户ID;
if(objectStateEntry.State==EntityState.Added)
{//添加了一个条目
audit.NewValue=GetEntryValueInString(objectStateEntry,false);
audit.Action=AuditAction.Add;
}
else if(objectStateEntry.State==EntityState.Deleted)
{//已删除中的条目
audit.OldValue=GetEntryValueInString(objectStateEntry,true);
audit.Action=AuditAction.Delete;
}
其他的
{//条目已修改
audit.OldValue=GetEntryValueInString(objectStateEntry,true);
audit.NewValue=GetEntryValueInString(objectStateEntry,false);
audit.Action=AuditAction.Update;
IEnumerable modifiedProperties=objectStateEntry.GetModifiedProperties();
//将不匹配列名称的集合指定为序列化字符串
audit.ChangedColumns=JsonConvert.SerializeObject(modifiedProperties.ToArray());
}
退货审核;
}
///
///克隆实体。
///
///物体。
///EntityObject。
公共对象克隆性(BaseEntity obj)
{
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj),obj.GetType());
}
///
///获取字符串中的条目值。
///
///条目。
///如果设置为true[为原始值]。
///System.String。
私有字符串GetEntryValueInString(ObjectStateEntry条目,bool isOrginal)
{
if(entry.Entity是BaseEntity)
{
对象目标=克隆实体((BaseEntity)entry.Entity);
foreach(entry.GetModifiedProperties()中的字符串propName)
{
对象setterValue=null;
if(等边)
{
setterValue=entry.OriginalValues[propName];
}
其他的
{
setterValue=entry.CurrentValue[propName];
}
PropertyInfo-propInfo=target.GetType().GetProperty(propName);
if(setterValue==DBNull.Value)
{
setterValue=null;
}
SetValue(target,setterValue,null);
}
返回JsonConvert.SerializeObject(目标);
}
返回null;
}
有一个自引用循环导致了该问题 从seed方法插入的一些基础数据。当我将调试器附加到更新数据库进程时,它实际上给出了正确的异常。在我发布这个问题后用谷歌搜索它之前,我不知道你可以附加一个调试器 用同一个项目打开了第二个Visual Studio,将
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();
在ctor中,然后才能看到真正的异常。
“类型未解析”
消息让我觉得它找不到dll
谢谢你的时间
这个问题毫无意义。那么更新数据库想做什么呢?如果只添加引用的库,为什么要运行它?我已经使用添加迁移添加了一些新迁移,所以运行更新数据库来应用迁移。SavingChanges附带了一个事件,它使用Json.Net serializerOK,您显然在Seed方法中使用Json序列化,您可以显示这一部分吗?我已经编辑了我的问题并添加了OnSavingChanges代码。seed方法确实插入了一些基本数据,然后调用SaveChanges,这将调用invoke OnSavingChanges
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();