Смешивание основных функций EF и функции DBFunction для свойства JObject - PullRequest
1 голос
/ 22 мая 2019

У меня есть сущность со свойствами типа JObject, и мне нужно иметь возможность использовать DbFunctions для этих свойств.

Когда я выполняюсь, проект выдает исключение, говорящее, что DbFunction не допускает параметры типа JObject.

Объект похож на ...

public class OrchestrationRun
{
   public long Id { get; set; }
    public JObject MetaData { get; set; }
    public JObject SystemMetaData { get; set; }
}

DbContext выглядит как ...

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions options)
        : base(options)
    {
    }

    public virtual DbSet<OrchestrationRun> OrchestrationRun { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new OrchestrationRunConfiguration());

       // DbFunction mapping for JSON_VALUE
       modelBuilder.HasDbFunction( typeof(MyDbContext).GetMethod(nameof(JsonValue)))
                      .HasName("JSON_VALUE")
                      .HasSchema("");
    }

    // DbFunction
    public static string JsonValue(JObject column, [NotParameterized] string path) => throw new NotSupportedException();
}

OrchestrationRunConfiguration - это ...

public class OrchestrationRunConfiguration : IEntityTypeConfiguration<OrchestrationRun>
{
    public void Configure(EntityTypeBuilder<OrchestrationRun> builder)
    {
        builder.Property(e => e.MetaData).HasConversion(
            jObject => jObject != null ? jObject.ToString(Formatting.None) : null,
            json => string.IsNullOrWhiteSpace(json) ? null : JObject.Parse(json)
        );

        builder.Property(e => e.SystemMetaData).HasConversion(
             jObject => jObject != null ? jObject.ToString(Formatting.None): null,
             json => string.IsNullOrWhiteSpace(json) ? null : JObject.Parse(json)
         );
    }
}

Запрос, который я пытаюсь выполнить: ...

var dbResponse = (from or in this.dbContext.OrchestrationRun
where MyDbContext.JsonValue(or.MetaData,"$.Product.ProductCategoryName") == "EXAMPLE"
select new
       {
          Id = or.Id,
          CategoryId = "EXAMPLE"
       }

    ).ToList();

Примечание: Исключение возникает при создании экземпляра DbContext.Поэтому запрос никогда не вызывается.

Выдается исключение ...

System.InvalidOperationException: параметр 'column' для функции DbFunction 'MyDbContext.JsonValue' имеетнедопустимый тип 'JObject'.Убедитесь, что тип параметра может отображаться текущим поставщиком.в Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.ValidateDbFunctions (модель IModel) в Microsoft.EntityFrameworkCore.Internal.SqlServerModelValidator.Validate (модель IModel * * * *).1033 *

...