entity framework核心:私有或受保护的导航属性

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

class Model { public int Id { get; set; } virtual protected ICollection childs { get; set; } } 

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

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

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

更新:重构安全版本

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

或者使用支持字段。

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

或者尝试使用属性

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

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

我不确定这是否可行,整个模型应该是可用的,并且可以在低级别访问,对DTO的ViewModel等有任何限制