web-dev-qa-db-ja.com

Entity Framework Core:プライベートまたは保護されたナビゲーションプロパティ

この種のコードを機能させるために、プライベートまたは保護されたアクセスレベルでEFCoreのナビゲーションプロパティを定義することはどういうわけか可能ですか?

class Model {
   public int Id { get; set; }
   virtual protected ICollection<ChildModel> childs { get; set; }  
}
9
silent_coder

モデルビルダー内でタイプ/文字列を使用する2つのオプションがあります。

modelBuilder.Entity<Model>(c =>
    c.HasMany(typeof(Model), "childs")
        .WithOne("parent")
        .HasForeignKey("elementID");
);

プライベートプロパティで動作するかどうかは100%確実ではありませんが、動作するはずです。

更新:リファクタリングセーフバージョン

modelBuilder.Entity<Model>(c =>
    c.HasMany(typeof(Model), nameof(Model.childs)
        .WithOne(nameof(Child.parent))
        .HasForeignKey("id");
);

または、バッキングフィールドを使用します。

var elementMetadata = Entity<Model>().Metadata.FindNavigation(nameof(Model.childs));
    elementMetadata.SetField("_childs");
    elementMetadata.SetPropertyAccessMode(PropertyAccessMode.Field);

または、プロパティで試してみてください

var elementMetadata = Entity<Model>().Metadata.FindNavigation(nameof(Model.childs));
    elementMetadata.SetPropertyAccessMode(PropertyAccessMode.Property);

EF Core 1.1の時点で、落とし穴があることに注意してください。メタデータの変更は、他のすべての.HasOne/.HasMany構成の後に最後に行う必要があります。そうしないと、メタデータが上書きされます。 関係を再構築すると注釈が失われる可能性があります を参照してください。

9
Tseng

それが可能かどうかはわかりませんが、モデル全体が利用可能であり、DTOのViewModelsなどに制限がある低レベルでアクセスできる必要があります

0
Mark Redman