實體框架核心:私有或受保護的導航屬性

.net-core asp.net-core c# entity-framework-core navigation-properties

是否有可能在EFCore中定義具有私有或受保護訪問級別的導航屬性,以使這種代碼工作:

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

一般承認的答案

您有兩個選項,在模型構建器中使用類型/字符串。

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的ViewModel等有任何限制



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow