Entity Framework 核心:私有或受保护的导航属性
Entity Framework Core: private or protected navigation properties
是否可以在 EFCore 中定义具有私有或受保护访问级别的导航属性以使此类代码工作:
class Model {
public int Id { get; set; }
virtual protected ICollection<ChildModel> childs { get; set; }
}
我不确定这是否可行,整个模型应该在低级别可用和访问,并且对 DTO 的 ViewModels 等有任何限制
您有两个选择,在模型构建器中使用 type/string。
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
配置之后,否则它会覆盖元数据。参见 Re-building relationships can cause annotations to be lost。
是否可以在 EFCore 中定义具有私有或受保护访问级别的导航属性以使此类代码工作:
class Model {
public int Id { get; set; }
virtual protected ICollection<ChildModel> childs { get; set; }
}
我不确定这是否可行,整个模型应该在低级别可用和访问,并且对 DTO 的 ViewModels 等有任何限制
您有两个选择,在模型构建器中使用 type/string。
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
配置之后,否则它会覆盖元数据。参见 Re-building relationships can cause annotations to be lost。