C# EF core多对多配置不使用Fluent API

C# EF core多对多配置不使用Fluent API,c#,asp.net,entity-framework,entity-framework-core,C#,Asp.net,Entity Framework,Entity Framework Core,我在理解和实现使用FLuent API和EF Core的多对多修复时遇到困难 我已经仔细考虑了这个问题,并完全按照这个问题建立了我的关系,但我得到了以下错误: 错误CS1061“CollectionNavigationBuilder”不包含“WithMany”的定义,并且找不到“WithMany”接受类型为“CollectionNavigationBuilder”的第一个参数的扩展方法(是否缺少using指令或程序集引用?) 这是我的意图。我有一个客户,他有很多工作。我应该能够得到所有与该客户相

我在理解和实现使用FLuent API和EF Core的多对多修复时遇到困难

我已经仔细考虑了这个问题,并完全按照这个问题建立了我的关系,但我得到了以下错误:

错误CS1061“CollectionNavigationBuilder”不包含“WithMany”的定义,并且找不到“WithMany”接受类型为“CollectionNavigationBuilder”的第一个参数的扩展方法(是否缺少using指令或程序集引用?)

这是我的意图。我有一个客户,他有很多工作。我应该能够得到所有与该客户相关的工作。EF应该在后台创建联接表

以下是我的课程:

public class Client : IEntityBase
{
    public int Id { get; set; }

    public int? JobId { get; set; }
    public ICollection<Job> Jobs { get; set; }
}

public class Job : IEntityBase
{
    public int Id { get; set; }
}

//my interface
public interface IEntityBase
{
    int Id { get; set; }
}
公共类客户端:IEntityBase
{
公共int Id{get;set;}
public int?JobId{get;set;}
公共ICollection作业{get;set;}
}
公共类作业:IEntityBase
{
公共int Id{get;set;}
}
//我的界面
公共接口IEntityBase
{
int Id{get;set;}
}
编辑这是我尝试的Fluent API,以及在“.withMany”上出现错误的地方

modelBuilder.Entity()
.HasMany(p=>p.Jobs)
.WithMany(p=>p.clients)
.Map(m=>
{
m、 MapLeftKey(“客户ID”);
m、 MapRightKey(“JobId”);
m、 ToTable(“客户工作”);
});
根据Chris Sakell的博客,我正在使用一个通用的存储库模式。以下是检索客户端的代码:

        IEnumerable<Client> _clients = _clientRepository
           .AllIncluding(s => s.Creator, s => s.Jobs, s => s.State)
           .OrderBy(s => s.Id)
           .Skip((currentPage - 1) * currentPageSize)
           .Take(currentPageSize)
           .ToList();
IEnumerable\u clients=\u clientRepository
.alling包括(s=>s.Creator,s=>s.Jobs,s=>s.State)
.OrderBy(s=>s.Id)
.Skip((当前页面-1)*当前页面大小)
.Take(当前页面大小)
.ToList();
我使用的通用代码如下所示:

    public virtual IEnumerable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
    {
        IQueryable<T> query = _context.Set<T>();
        foreach (var includeProperty in includeProperties)
        {
            query = query.Include(includeProperty);
        }
        return query.AsEnumerable();
    }
公共虚拟IEnumerable AllIncluding(参数表达式[]includeProperties)
{
IQueryable查询=_context.Set();
foreach(includeProperty中的var includeProperty)
{
query=query.Include(includeProperty);
}
返回query.AsEnumerable();
}

如何配置它,以便根据上面的Allincluding语句使用includeproperty检索作业?

您也应该将Clients属性添加到作业类中:

public class Job : IEntityBase
{
   public int Id { get; set; }
   public ICollection<Client> Clients{ get; set; }
}
公共类作业:IEntityBase
{
公共int Id{get;set;}
公共ICollection客户端{get;set;}
}

然后一切都应该井然有序。

您试图实现的Fluent API示例来自EF 6。EF Core中的多对多关系配置略有不同。首先,您需要包含一个实体来表示联接/桥接表:

public class ClientsJobs
{
    public int ClientId { get; set; }
    public int JobId { get; set; }
    public Client Client { get; set; }
    public Job Job { get; set; }
}
然后在OnModelCreating方法中进行如下配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ClientsJobs>()
        .HasKey(x => new { x.ClientId, x.JobId });

    modelBuilder.Entity<ClientsJobs>()
        .HasOne(x => x.Client)
        .WithMany(y => y.Jobs)
        .HasForeignKey(y => y.JobId);

    modelBuilder.Entity<ClientsJobs>()
        .HasOne(x => x.Job)
        .WithMany(y => y.Clients)
        .HasForeignKey(y => y.ClientId);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasKey(x=>new{x.ClientId,x.JobId});
modelBuilder.Entity()
.HasOne(x=>x.Client)
.有许多(y=>y.工作)
.HasForeignKey(y=>y.JobId);
modelBuilder.Entity()
.HasOne(x=>x.Job)
.有许多(y=>y.客户)
.HasForeignKey(y=>y.ClientId);
}
更多信息请参见此处:


注意:您确实需要在相关类中包含关系两端的导航属性,因此您需要向您的
作业
实体添加
客户
属性。

对于EF Core 5.0及以上版本,您可以(最后)对多对多使用直接关系:

modelBuilder
.Entity<Post>()
.HasMany(p => p.Tags)
.WithMany(p => p.Posts)
.UsingEntity(j => j.ToTable("PostTags"));
modelBuilder
.实体()
.HasMany(p=>p.Tags)
.有许多(p=>p.Posts)
.UsingEntity(j=>j.ToTable(“posttag”);

来源:

查看EF核心文档--多对多将出现错误“CollectionNavigationBuilder不包含”withMany的定义“即使在我添加了这些内容之后……今天仍然是这样吗?根据EF Core站点上的文档,您应该可以不定义加入实体:站点是否不正确或过时?@FedericoM.Rinaldi文档引用了添加到5.0 rc1中的功能。该网站还没有赶上。感谢您的澄清,我花了一段时间才意识到文档比EF本身更新得多。LOL
客户端和
作业是
客户端作业的集合,而不是
Client
Job
?这属于DbContext的onmodel创建方法(如果不明显)。你可以在源代码中找到更多的例子。有没有办法让导航只在一侧?Aka
。WithMany()
?应该有一个覆盖,它接受泛型类型参数。对于many(),EF Core 5.0中没有-我已经开始悬赏这个问题:看起来单向不受支持(尚未?):
modelBuilder
.Entity<Post>()
.HasMany(p => p.Tags)
.WithMany(p => p.Posts)
.UsingEntity(j => j.ToTable("PostTags"));