【问题标题】: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 导航属性才能添加所需的行为,但是有没有办法使用影子属性来做到这一点?

【问题讨论】:

    标签: entity-framework-core


    【解决方案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 类型添加相应的私有属性。

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多