エンティティモデルが継承するクラス内のプライベートセッターは、EFCoreの移行に関する奇妙な問題を引き継ぐようです。 Foo
を継承する複数のクラス( Bar
とBaz
)がある次の例を考えてみましょう。 Add-Migration
コマンドを複数回実行すると( private
修飾子を追加/削除する)、生成されたスキーマは複数の点で間違っています。
Created
プロパティがドロップされた列に設定されることがありますCreated
すべてのプロパティが削除されるように設定されていて、置き換えられたり名前が変更されたりしないことがあります。 EFCoreツールは実際に特別な注意を払ってプライベートセッターでプロパティを扱っていないことは私の理解です。これは誤った仮定ですか?もしそうなら、なぜ一部の民間セッターは、基本クラスではなく、他人に動作していますか?私はこれがEFツールのバグだと思っています。おそらく、プロパティに名前を付ける方法に関連していますが、モデルに似たような名前のプロパティがあり、ツールを混乱させるかもしれないと考えています
public class Context : DbContext
{
public DbSet<Bar> Bars { get; set; }
public DbSet<Baz> Bazs { get; set; }
}
public class Bar : Foo { }
public class Baz : Foo { }
public abstract class Foo
{
protected Foo()
{
Created = DateTimeOffset.UtcNow;
}
public DateTimeOffset? Created { get; private set; }
public DateTimeOffset? Updated { get; set; }
}
編集 - >それは、DateTimeOffsetのためのプライベート設定は、EFツールがベースクラスでそれらをマップすることはありません。しかし、私はbuilder.Entity<Foo>().HasAlternateKey(x => x.RequiredStringProperty);
と一緒に、 [Required]
と[StringLength]
属性を持つプライベートなセッターを持つ文字列プロパティを持っていますbuilder.Entity<Foo>().HasAlternateKey(x => x.RequiredStringProperty);
その場合、EFはプロパティを絶対的にマップしますが、 Foo
を継承しているクラスの一部でのみマップされます。
EFコアツールは、特定の条件下でのみ基本クラスのプライベートセッターをマップします。
たとえば、 builder.Entity<Bar>().HasAlternateKey(x => x.Created);
EFツールは、プライベートまたはパブリックセッターを持っているかどうかにかかわらず、 Created
プロパティをマップします。