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)
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)
那么一切都应该井然有序。
| 归档时间: |
|
| 查看次数: |
4582 次 |
| 最近记录: |