反向导航阴影属性和代理
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 类型添加相应的私有属性。
即使没有跟踪或延迟加载代理。
简而言之,无论您是否愿意,在他们为您所要求的内容添加支持之前,正确的方法是简单地遵循他们的要求并将集合导航属性放在两侧。
【讨论】:
以上是关于反向导航阴影属性和代理的主要内容,如果未能解决你的问题,请参考以下文章