Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF Core 2中多对多的LINQ_Entity Framework_Linq_Asp.net Core_Many To Many - Fatal编程技术网

Entity framework EF Core 2中多对多的LINQ

Entity framework EF Core 2中多对多的LINQ,entity-framework,linq,asp.net-core,many-to-many,Entity Framework,Linq,Asp.net Core,Many To Many,我在谷歌和stackoverflow上搜索了一段时间,是的,我找到了很多关于这个主题的文章,但我似乎仍然不知道我做错了什么 问题:我确实在三个表之间有一个“链接”表(多对多): -检查 -汽车 -大门 我的“链接”类如下所示: public class CheckCarGate { public int CheckId { get; set; } public Check Check{ get; set; } public int CarId { get; set; }

我在谷歌和stackoverflow上搜索了一段时间,是的,我找到了很多关于这个主题的文章,但我似乎仍然不知道我做错了什么

问题:我确实在三个表之间有一个“链接”表(多对多): -检查 -汽车 -大门

我的“链接”类如下所示:

public class CheckCarGate
{
    public int CheckId { get; set; }
    public Check Check{ get; set; }

    public int CarId { get; set; }
    public Car Car{ get; set; }

    public int GateId { get; set; } 
    public Gate Gate { get; set; } 
}
DbContext:

public virtual DbSet<Car> Cars{ get; set; }
public virtual DbSet<Gate> Gates { get; set; }
public virtual DbSet<Check> Checks{ get; set; }
或:

//编辑:我很抱歉没有提供足够的信息!请容忍我

有人能给我指一下正确的方向吗

非常感谢


N.

我不确定这里是否有足够的信息来回答你的问题;似乎每一张支票都有自己的支票门,这并没有什么意义

假设您有一个单独的支票表和CheckCarGate表,您可以使用where和select进行此查询

var out = CheckCarGateTable.Where(t => t.CarID == targetCarID)
          .Select(c => checks.getbyid(c.CheckID))
或者,根据您的类定义

var out = CheckCarGateTable.Where(t => t.CarID == targetCarID)
          .Select(c => c.Check))
首先,我们获取所有指向目标车的支票,然后使用select调用将这些支票转换为支票;out应为IEnumerable

并按如下方式处理列表:

foreach (Check c in out)
{
     proc(c);
}
这是我对给出的信息所能做的最好的了。

您的onmodel创建(…)应该包含更多定义关系的内容

protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<CheckCarGate>().HasKey(p => new { p.CheckId, p.CarId, p.GateId });

        builder.Entity<CheckCarGate>().HasOne(c => c.car)
                                      .WithMany(c => c.check)
                                      .HasForeignKey(k => k.carId)

        ...
    }
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.Entity().HasKey(p=>new{p.CheckId,p.CarId,p.GateId});
builder.Entity().HasOne(c=>c.car)
.WithMany(c=>c.check)
.HasForeignKey(k=>k.carId)
...
}

我不确定在那之后您如何更改查询,您提供的文档链接没有示例用法。

我放弃了寻找LINQ解决方案。(浪费了2天)

相反,我决定使用原始sql并将数据存储在一个新对象中


归功于:和他的解决方案:

您能包括您的映射吗?(DbContext上的EntityTypeConfiguration或modelBuilder配置)您还看到了什么问题?错误或空值?
\u context.CheckCarGates.Include(x=>x.Check)。Include(x=>x.Gate)。其中(x=>x.CarId==12))。选择(x=>new{x.Gate,x.Check})我不确定gate是否应该有一张支票gate谢谢你的回答,很抱歉没有提供足够的信息。由于CheckCarGate表是一个“链接”表,我不能将其与_context.xxxxx一起使用。这是一个导航property@Nearshore那是你的误解。没有任何东西可以阻止您在上下文中包含属性
DbSet
var out = CheckCarGateTable.Where(t => t.CarID == targetCarID)
          .Select(c => checks.getbyid(c.CheckID))
var out = CheckCarGateTable.Where(t => t.CarID == targetCarID)
          .Select(c => c.Check))
foreach (Check c in out)
{
     proc(c);
}
protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<CheckCarGate>().HasKey(p => new { p.CheckId, p.CarId, p.GateId });

        builder.Entity<CheckCarGate>().HasOne(c => c.car)
                                      .WithMany(c => c.check)
                                      .HasForeignKey(k => k.carId)

        ...
    }