asp.net EF核心多对多配置无法与Fluent API配合使用

wnavrhmk  于 2023-01-27  发布在  .NET
关注(0)|答案(3)|浏览(138)

我在使用Fluent API和EF Core理解和实现多对多修复方面遇到了困难。
我已经查看了this问题,并完全按照该问题设置了关系,但我得到了以下错误:
错误CS1061“CollectionNavigationBuilder”不包含“WithMany”的定义,并且找不到接受“CollectionNavigationBuilder”类型的第一个参数的扩展方法“WithMany”(是否缺少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; }
}

EDIT这是我尝试的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");
            });

根据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();

我使用的泛型代码如下:

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();
    }

我如何配置它,以便我也可以按照上面的Allincluding语句使用include属性检索作业?

yptwkmov

yptwkmov1#

您尝试实现的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);
}

在此查看更多信息:http://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration
注意:您确实需要在相关类中包含关系两端的导航属性,因此您需要向Job实体添加一个Clients属性。

s8vozzvw

s8vozzvw2#

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

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

来源:关系- EF核心|Microsoft(多对多)

piah890a

piah890a3#

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

public class Job : IEntityBase
{
   public int Id { get; set; }
   public ICollection<Client> Clients{ get; set; }
}

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

相关问题