实体框架核心:私有或受保护的导航属性

sil*_*der 9 c# navigation-properties entity-framework-core .net-core asp.net-core

是否有可能在EFCore中使用私有或受保护的访问级别定义导航属性,以使这种代码工作:

class Model {
   public int Id { get; set; }
   virtual protected ICollection<ChildModel> childs { get; set; }  
}
Run Code Online (Sandbox Code Playgroud)

Tse*_*eng 9

您有两个选项,在模型构建器中使用类型/字符串.

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

不是100%肯定它适用于私有属性,但它应该.

更新:重构安全版本

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

或使用支持字段.

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

或者尝试使用属性

var elementMetadata = Entity<Model>().Metadata.FindNavigation(nameof(Model.childs));
    elementMetadata.SetPropertyAccessMode(PropertyAccessMode.Property);
Run Code Online (Sandbox Code Playgroud)

请注意,从EF Core 1.1开始,有一个问题:元数据修改必须在所有其他.HasOne/.HasMany配置之后最后完成,否则它将覆盖元数据.请参阅重建关系可能导致注释丢失.