EF核心多对多配置无法使用Fluent API

si2*_*030 5 c# asp.net entity-framework entity-framework-core

我在使用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; }
}
Run Code Online (Sandbox Code Playgroud)

编辑这是我试过的Fluent API,我在".withMany"上收到错误

        modelBuilder.Entity<Client>()
            .HasMany(p => p.Jobs)
            .WithMany(p => p.clients)
            .Map(m =>
            {
                m.MapLeftKey("ClientId");
                m.MapRightKey("JobId");
                m.ToTable("ClientJob");
            });
Run Code Online (Sandbox Code Playgroud)

我根据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();
Run Code Online (Sandbox Code Playgroud)

我按照以下方式使用通用代码:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

我如何配置这个以便我可以根据上面的Allincluding语句使用includeproperty来检索作业?

Lop*_*ded 12

对于 EF Core 6.0 及更高版本,您可以(最终)使用多对多的直接关系:

modelBuilder
.Entity<Post>()
.HasMany(p => p.Tags)
.WithMany(p => p.Posts)
.UsingEntity(j => j.ToTable("PostTags"));
Run Code Online (Sandbox Code Playgroud)

来源:关系 - EF Core | 微软(多对多)


Mik*_*ind 10

您尝试实现的Fluent API示例来自EF 6.许多对多关系配置在EF Core中略有不同.首先,您需要包含一个实体来表示join/bridging表:

public class ClientsJobs
{
    public int ClientId { get; set; }
    public int JobId { get; set; }
    public Client Client { get; set; }
    public Job Job { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后在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);
}
Run Code Online (Sandbox Code Playgroud)

在此处查看更多相关信息:http://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

注意:您需要包括在相关类的关系两端的导航性能,所以你需要一个添加Clients属性的Job实体.


Mih*_*scu -3

您还应该将 Clients 属性添加到 Job 类中:

public class Job : IEntityBase
{
   public int Id { get; set; }
   public ICollection<Client> Clients{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

那么一切都应该井然有序。

  • 即使我添加了此内容,仍然收到错误“CollectionNavigationBuilder&lt;Client, Job&gt; 不包含“withMany”的定义... (4认同)