Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心:私有或受保护的导航属性_C#_Asp.net Core_.net Core_Entity Framework Core_Navigation Properties - Fatal编程技术网

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

C# 实体框架核心:私有或受保护的导航属性,c#,asp.net-core,.net-core,entity-framework-core,navigation-properties,C#,Asp.net Core,.net Core,Entity Framework Core,Navigation Properties,是否有可能在EFCore中定义具有私有或受保护访问级别的导航属性,以使此类代码正常工作: class Model { public int Id { get; set; } virtual protected ICollection<ChildModel> childs { get; set; } } 类模型{ 公共int Id{get;set;} 虚拟受保护的ICollection子项{get;set;} } 我不确定这是否可行,整个模型应该在低级别可用,并且对D

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

class Model {
   public int Id { get; set; }
   virtual protected ICollection<ChildModel> childs { get; set; }  
}
类模型{
公共int Id{get;set;}
虚拟受保护的ICollection子项{get;set;}
}

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

您有两个选项,在模型生成器中使用类型/字符串

modelBuilder.Entity<Model>(c =>
    c.HasMany(typeof(Model), "childs")
        .WithOne("parent")
        .HasForeignKey("elementID");
);
modelBuilder.Entity(c=>
c、 HasMany(型号),“childs”)
.一方(“父母”)
.HasForeignKey(“elementID”);
);
不是100%确定它适用于私有属性,但它应该

更新:重构安全版本
modelBuilder.Entity(c=>
c、 HasMany(typeof(Model),nameof(Model.childs)
.带一个(姓名(子女、父母))
.HasForeignKey(“id”);
);
或者使用支持字段

var elementMetadata = Entity<Model>().Metadata.FindNavigation(nameof(Model.childs));
    elementMetadata.SetField("_childs");
    elementMetadata.SetPropertyAccessMode(PropertyAccessMode.Field);
var elementMetadata=Entity().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);
var elementMetadata=Entity().Metadata.FindNavigation(nameof(Model.childs));
elementMetadata.SetPropertyAccessMode(PropertyAccessMode.Property);

请注意,从EF Core 1.1开始,有一个问题:元数据修改必须在所有其他
.HasOne/.HasMany
配置之后最后完成,否则它将覆盖元数据。请参阅。

如果它是私有/受保护的,EF如何能够知道该属性存在?以某种方式在modelbuilder中指定。在某些情况下,EF可能拥有acce请看,如果你知道怎么做,问题是什么?你试过了吗?发生了什么?拥有一个私有导航属性会给你带来什么好处?为什么还要声明它?本文中的方法描述的是常规字段,而不是导航字段。这太棒了。我无法测试第二个变体,但看起来像第一个适用于我的受保护导航属性,至少适用于inmemory数据库。嗯……事实上我已经不确定它是否如我所预期的那样工作。问题是我不能单独测试这个,因为EF自动加载所有已经加载到给定上下文的实体。在inmemory的情况下,看起来所有数据都一直在加载,所以我有点丢失,如何验证这一点。我甚至为此提出了一个特殊的问题:它也应该适用于真正的提供者,只要你)急切地用
加载它。Include(nameof(Model.childs))
。Include(“childs”)
。Include(“childs.grands”)
(等同的)。您无论如何都不应该使用InMemory Provider,除了单元测试之外,它不应该用于生产。谢谢,看起来我可以检查一下。唯一让我担心的是,是否有可能以某种方式避免使用字符串?因为这可能会在重构时被打破。请参见上面我的第二个示例,您可以使用
nameof(Model.childs)
。它甚至可以与私有成员一起使用,但仅在(…)的
名称中使用。
。如果应用域驱动设计(DDD),则不适用。然后对聚合及其实体进行限制。
var elementMetadata = Entity<Model>().Metadata.FindNavigation(nameof(Model.childs));
    elementMetadata.SetPropertyAccessMode(PropertyAccessMode.Property);