在实体框架的另一端可以有多对多和一对多而没有集合属性吗

问题描述 投票:0回答:1

这是我当前的工作解决方案:

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个属性?

entity-framework entity-framework-core .net-6.0
1个回答
3
投票

更新(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
集合属性保留在模型中(即使您“不需要”后者)和现有的流畅配置。

© www.soinside.com 2019 - 2024. All rights reserved.