この種のコードを機能させるために、プライベートまたは保護されたアクセスレベルでEFCoreのナビゲーションプロパティを定義することはどういうわけか可能ですか?
class Model {
public int Id { get; set; }
virtual protected ICollection<ChildModel> childs { get; set; }
}
モデルビルダー内でタイプ/文字列を使用する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
構成の後に最後に行う必要があります。そうしないと、メタデータが上書きされます。 関係を再構築すると注釈が失われる可能性があります を参照してください。
それが可能かどうかはわかりませんが、モデル全体が利用可能であり、DTOのViewModelsなどに制限がある低レベルでアクセスできる必要があります