EFコアがカスタム注釈を設定しない理由

c# entity-framework-core

質問

DbContextでは、以下のようにモデルを宣言します:

modelBuilder.Entity<FileStore>().Property(x => x.FileStoreId)
            .ValueGeneratedNever()
            .ForSqlServerHasDefaultValueSql("NewSequentialId()")
            .HasAnnotation("RowGuidColumn", true);

移行を追加した後、HasAnnotation( "RowGuidColumn"、true)は注釈を列に追加しません:

 columns: table => new
            {
                FileStoreId = table.Column<Guid>(nullable: false, defaultValueSql: "NewSequentialId()"),
                CreationTime = table.Column<DateTimeOffset>(nullable: false),
            }

私は主に注釈を直接追加します:

FileStoreId = table.Column<Guid>(nullable: false, defaultValueSql: "NewSequentialId()").**Annotation("RowGuidColumn", true)**

Add-MigrationでAutoを生成するAnnotationをどのように追加できますか?

受け入れられた回答

プロバイダは、どのモデル注釈が移行操作にコピー/変換されるかを指定します。求めていることをするには、プロバイダー固有のIMigrationsAnnotationProviderサービスをオーバーライドする必要があります。

optionsBuilder.UseSqlServer(connectionString)
  .ReplaceService<SqlServerMigrationsAnnotationProvider, MyMigrationsAnnotationProvider>();

そしてここに実装があります。

class MyMigrationsAnnotationProvider : SqlServerMigrationsAnnotationProvider
{
    public override IEnumerable<IAnnotation> For(IProperty property)
        => base.For(property)
            .Concat(property.GetAnnotations().Where(a => a.Name == "RowGuidColumn"));
}

そこから、プロバイダー固有のIMigrationsSqlGeneratorサービスをオーバーライドすることでSQLに変換する必要があります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ