【问题标题】:Can a navigation property be protected internal virtual?导航属性可以保护内部虚拟吗?
【发布时间】:2016-11-17 15:04:19
【问题描述】:

根据Why do navigation properties have to be public for a proxy to be created?,导航属性可以被保护内部虚拟并且不需要是公共虚拟并且实体框架仍将提供代理。 我编写了这样的导航属性:

protected internal virtual ICollection<MyEntityType> MyNavigationCollection { get; set; }

在映射中我显然有:

.WithMany(t => t.MyNavigationCollection )

这似乎与我引用的文章一致。我遇到的问题是,当我查询拥有对象时,Entity Framework 不再将代理集合的实例分配给 MyNavigationCollection,因为我已将 MyNavigationCollection 的可见性更改为受保护的内部虚拟。

为了让 Entity Framework 将代理对象用于具有可访问性保护的内部虚拟的集合,我错过了什么?

【问题讨论】:

    标签: c# entity-framework proxy


    【解决方案1】:

    有点晚了,但这需要纠正,因为这是可能的。因为我总是这样做,因为隐藏您的可更新集合是 DDD 中的最佳实践。暴露你的收藏会发出警告。

    所以我遇到了一种情况,在一种情况下它确实像往常一样工作。但随后另一个导航属性不起作用。然后我发现了不同之处……

    这是不行的

    HasRequired(x => x.Source).WithMany(t => t.MyNavigationCollection);
    

    你要做的就是像这样在另一端配置它

    HasMany(t => t.MyNavigationCollection).WithRequired(x => x.Source);
    

    (不确定是否需要两者。)

    希望它仍然有用!

    【讨论】:

      【解决方案2】:

      道具不能是内部的。如果标记为内部,则实体框架代码无法访问它。删除内部,它应该可以工作。

      代理未在您的程序集中预先定义,因此内部将不起作用。

      内部项目仅对包含它们的程序集可见,EF 代码在程序集外部,因此代理将无法访问它,代理对受保护项目具有完全可见性,因为它继承了您的类,这使得代理中可见的受保护成员。

      【讨论】:

      • 你确定吗?受保护的内部意味着既受保护又是内部的,那么为什么要通过内部扩大可见性使其对实体框架不那么可见呢?
      • 内部项目仅对包含它们的程序集可见,EF 代码在程序集外部,因此代理将无法访问它,代理对受保护项目具有完全可见性,因为它是继承你的类,使受保护的成员在代理中可见。
      • 您引用的 SO 中的 cmets 也解释了这一点。内部根本行不通。保护好。
      • 有人可以确认,您确实创建了一个受保护的导航属性并且它是由代理对象提供服务的吗?
      • 只做两个类库项目,一个引用一个。然后从另一个继承一个类,你会看到受保护的内部对另一个库中的继承类不可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2013-11-18
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多