1

HasAnnotation使用接受参数类型的方法向 EF 模型添加纯字符串注释很容易object,但是尝试添加结构化注释会在构建迁移时出错:

        modelBuilder.Entity<Group>().HasAnnotation($"{GetType().FullName}.Constraint3", new ValueTuple<string,string>( "aaa", "bbb" ));

The current CSharpHelper cannot scaffold literals of type 'System.ValueTuple`2[System.String,System.String]'. Configure your services to use one that can.

        modelBuilder.Entity<Group>().HasAnnotation($"{GetType().FullName}.Constraint2", new[] { "aaa", "bbb" });

The current CSharpHelper cannot scaffold literals of type 'System.String[]'. Configure your services to use one that can.

我们是否有办法target builder将有助于序列化结构化注释的方法注入?

为什么我会需要它?只是试图在一个地方收集所有数据库元数据。而元通常是结构化信息。

4

1 回答 1

2

据我了解(如果有的话,关于它的信息并不多),这个想法是使用简单的名称/值对,其中值是原始类型(string, int,decimalDateTime加上enums )并且名称构成结构. 所有 EF Core 注释都遵循该原则。例如,名称:"SqlServer:ValueGenerationStrategy"类型:SqlServerValueGenerationStrategy等。

可能最简单的方法就是简单地遵循该约定。但无论如何,负责任的服务是ICSharpHelper-UnknownLiteral方法。并且默认实现是在CSharpHelper课堂上。

因此,您可以从中派生,覆盖该UnknownLiteral方法并在那里进行自己的(预处理)处理:

using Microsoft.EntityFrameworkCore.Design.Internal;

public class MyCSharpHelper : CSharpHelper
{
    public override string UnknownLiteral(object value)
    {
        // Preprocess the value here...
        return base.UnknownLiteral(value);
    }
}

然后用你的替换标准服务:

using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.DependencyInjection;

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
    {
        services.AddSingleton<ICSharpHelper, MyCSharpHelper>();
    }
}
于 2018-01-12T18:30:58.117 回答