反向导航阴影属性和代理

Posted

技术标签:

【中文标题】反向导航阴影属性和代理【英文标题】:Inverse navigation shadow properties and proxies 【发布时间】:2022-01-22 04:09:49 【问题描述】:

当我尝试仅在关系的一端使用 CLR 导航属性映射多对多关系时,我遇到了 EF Core 5.0 的问题。

例如,一个问题可以有多个答案,而一个答案可以应用于多个问题(重复)。为简单起见,我不想从重复问题的答案返回。

public class Question

    public int Id  get; set; 

    public virtual IEnumerable<Answer> Answers  get; set;  = new List<Answer>();

    public string Text  get; set;  = "";


public class Answer

    public int Id  get; set; 

    public string Text  get; set;  = "";


public class SomeDbContext : DbContext

    public DbSet<Question> Questions => Set<Question>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<Question>().HasMany(q => q.Answers).WithMany("Duplicates");
    

这工作正常,直到我启用更改跟踪代理或延迟加载代理。然后我开始收到说我需要添加反向导航属性的异常。

System.InvalidOperationException:实体类型“Answer”上的属性“重复”在没有 CLR 属性的情况下进行映射。 “UseChangeTrackingProxies”要求所有实体类型都是公共的、未密封的、具有虚拟属性并具有公共或受保护的构造函数。 'UseLazyLoadingProxies' 只要求导航属性是虚拟的。

我知道代理需要virtual 导航属性才能添加所需的行为,但是有没有办法使用影子属性来做到这一点?

【问题讨论】:

【参考方案1】:

我知道代理需要virtual 导航属性才能添加所需的行为,但是有没有办法使用影子属性来做到这一点?

目前(包括 v6.0 在内)EF Core支持shadow navigation属性。

当我尝试仅在关系的一端使用 CLR 导航属性映射多对多关系时,我遇到了 EF Core 5.0 的问题。

正如Many-to-many 文档开头明确指出的那样:

多对多关系需要两边都有一个集合导航属性。

计划在未来添加对单侧跳过导航(单向)多对多关系的支持,但目前这是一个限制(并且要求您的模型)。

这工作正常,直到我启用更改跟踪代理或延迟加载代理。

如上所述,您正在执行的操作不受支持。您刚刚在 5.0 中发现了一个后门,顺便说一句,它在 6.0 中已关闭,因此在 6.0 中,这样的模型配置只会抛出 InvalidOperationException

无法在“Answer.Duplicates”和“Question.Answers”之间建立多对多关系,因为其中一个或两个导航没有对应的 CLR 属性。考虑为实体 CLR 类型添加相应的私有属性。

即使没有跟踪或延迟加载代理。

简而言之,无论您是否愿意,在他们为您所要求的内容添加支持之前,正确的方法是简单地遵循他们的要求并将集合导航属性放在两侧。

【讨论】:

以上是关于反向导航阴影属性和代理的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 ios 14 的导航栏图像阴影? [关闭]

状态栏和导航栏上的 Google Now 渐变/阴影

导航栏中标题的默认字体大小、字体名称和阴影是多少?

Android 移除导航抽屉上的阴影

如何隐藏反应导航标题下的阴影?

更改模式时如何更改导航阴影颜色?