这是我当前的工作解决方案:
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
上没有这2个属性?
更新(EF Core 7.0+):
EF Core 7 添加了对单向多对多关系的支持,因此从那时起,所有类型关系的答案都是肯定的。
原文:
一对多的答案是肯定的(是)。从
Persons2
中删除 Foo
属性并使用 WithMany
不传递导航属性(因为没有):
modelBuilder.Entity<Person>()
.HasOne(o => o.BonusFoo)
.WithMany(); // <--
目前多对多的答案是否定的(否)(EF Core 5、6),如多对多文档开头所述:
多对多关系需要集合导航属性在两侧。
在即将推出的 EF Core 7 中这将是可能的 - 通过影子导航支持单向多对多关系#3864。
在那之前,将
Person.Foos
和 Foo.Persons
集合属性保留在模型中(即使您“不需要”后者)和现有的流畅配置。