Сериализация DbCommand с помощью Newtonsoft.Json
Я пытаюсь сериализовать Entity Framework DbCommand
Json с Newtonsoft.Json
:
public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) {
var path = "C:/result.json";
File.WriteAllText(path, JsonConvert.SerializeObject(command));
}
Тем не менее, в результате файл JSON параметры ToString()
ценности, а не объекты:
"Parameters": ["@0", "@1", "@2"]
Как мне сказать сериализатору сериализовать целые объекты?
1 ответ
Вы можете записать фактические значения с помощью пользовательских JsonConverter
,
Сначала образец запроса:
using (var context = new SchoolDbContext("dbConnectionString"))
{
var id = 11;
var dni = 36170503;
var sql = @"SELECT name FROM dbo.students WHERE Id = {0} OR Dni = {1}";
context.Database.ExecuteSqlCommand(sql, id, dni);
}
Затем добавьте пользовательский перехватчик EF следующим образом:
public class MyDBConfiguration : DbConfiguration
{
public MyDBConfiguration()
{
DbInterception.Add(new EntityFrameworkInterceptor());
}
}
public class EntityFrameworkInterceptor : IDbCommandInterceptor
{
public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
var path = @"C:\Users\miparnisari\Documents\log.json";
var serialized = JsonConvert.SerializeObject(command, new DbCommandSerializer());
File.WriteAllText(path, serialized);
}
}
Наконец, сериализатор:
public class DbCommandSerializer : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var dbCommand = value as DbCommand;
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("Query");
writer.WriteValue(dbCommand.CommandText);
writer.WritePropertyName("Parameters");
writer.WriteStartObject();
foreach (DbParameter param in dbCommand.Parameters)
{
writer.WritePropertyName(param.ParameterName);
writer.WriteValue(param.Value);
}
writer.WriteEndObject();
writer.WriteEndObject();
writer.Flush();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return typeof(DbCommand).IsAssignableFrom(objectType);
}
}
Это журналы:
{
"Query": "SELECT name FROM dbo.students WHERE Id = @p0 OR Dni = @p1",
"Parameters": {
"p0": 11,
"p1": 36170503
}
}