プライベートセッターによるEFCoreベースエンティティモデルのプロパティ - マイグレーションの奇妙な動作

c# entity-framework-core

質問

エンティティモデルが継承するクラス内のプライベートセッターは、EFCoreの移行に関する奇妙な問題を引き継ぐようです。 Fooを継承する複数のクラス( BarBaz )がある次の例を考えてみましょう。 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プロパティをマップします。



Related

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