这是我当前的工作解决方案:
public class Person
{
public ICollection<Foo> Foos { get; set; }
public Foo BonusFoo { get; set; }
}
public class Foo
{
public ICollection<Person> Persons { get; set; }
public ICollection<Person> Persons2 { get; set; }
}
public class MemContext : DbContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasMany(b => b.Foos)
.WithMany(o => o.Persons);
modelBuilder.Entity<Person>()
.HasOne(o => o.BonusFoo)
.WithMany(o => o.Persons2);
base.OnModelCreating(modelBuilder);
}
}
我将永远不需要访问代码Foo.Persons
或Foo.Persons2
,是否可以具有相同的配置,但在Foo
上没有这两个属性?
一对多的答案是肯定的(是(。从Foo
中删除Persons2
属性,并使用不传递导航属性的WithMany
(因为没有(:
modelBuilder.Entity<Person>()
.HasOne(o => o.BonusFoo)
.WithMany(); // <--
目前,多对多的答案是否定的(没有((EF Core 5,6(,如多对多文档开头所述:
多对多关系需要两侧的集合导航属性。
在即将推出的EF Core 7中,这是可能的-通过影子导航#3864支持单向多对多关系。
在此之前,请在模型中保留Person.Foos
和Foo.Persons
集合属性(即使您"不需要"后者(和现有的fluent配置。