我在使用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属性检索作业?
3条答案
按热度按时间yptwkmov1#
您尝试实现的Fluent API示例来自EF 6。多对多关系配置在EF Core中略有不同。首先,您需要包含一个实体来表示连接/桥接表:
然后在OnModelCreating方法中按如下方式配置它:
在此查看更多信息:http://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration
注意:您确实需要在相关类中包含关系两端的导航属性,因此您需要向
Job
实体添加一个Clients
属性。s8vozzvw2#
对于EF Core 6.0及更高版本,您可以(* 最终 *)将直接关系用于多对多:
来源:关系- EF核心|Microsoft(多对多)
piah890a3#
您还应该将Clients属性添加到Job类中:
那么一切都应该井然有序。