具有存储库模式的 ASP.NET Core 8 无法找到多对多表的导航

问题描述 投票:0回答:1

使用 ASP.NET Core 8 MVC,我实现了

Event
表和
Product
表之间的多对多关系,然后在
Event
存储库中添加了特定查询以获取
Event
和包括与其关联的
Product
列表。

迁移成功创建了

EventProd
多对多表,但运行查询时出现错误,指示路径无效:

Microsoft.EntityFrameworkCore.Query.InvalidIncludePathError:无法找到在基于字符串的包含路径“EventProd.Product”中指定的导航“EventProd”

我确信我并不完全理解 ASP.NET Core 中通过多对多关系的实现所发生的所有魔力,但我可以更快地完成此任务,并且编写 SQL 连接和以这种方式提取数据。

如有任何帮助,我们将不胜感激!

这是模型(没有所有血淋淋的细节):

public class Event
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string? Description { get; set; }
    public List<EventProd> EventProducts { get; set; } = new List<EventProd>();
}    

public class Product
{
    public int Id { get; set; }
    [DisplayName("Product Name")]
    public string Title { get; set; }
    [DisplayName("Description")]
    public string Description { get; set; }
    
    public List<EventProd> EventProducts { get; set; }
}   

public class EventProd
{
     public int EventId { get; set; }
     public int ProductId { get; set; }
     public Event Event { get; set; }
     public Product Product { get; set; }
}

来自我的

ApplicationDbContext
文件:

public DbSet<Event> Events { get; set; }
public DbSet<EventMeal> EventMeals { get; set; }
public DbSet<Product> Products { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EventProd>()
                .HasKey(pt => new { pt.EventId, pt.ProductId });
    modelBuilder.Entity<EventProd>()
                .HasOne(pt => pt.Product)
                .WithMany(pt => pt.EventProducts)
                .HasForeignKey(pt => pt.ProductId);
    modelBuilder.Entity<EventProd>()
                .HasOne(pt => pt.Event)
                .WithMany(pt => pt.EventProducts)
                .HasForeignKey(P => P.EventId);
}

这是失败的存储库查询:

public Event GetById(int id)
{
     //List<int> productIdlist = _db.EventProd 
     return _db.Events
               .Include("EventProd.Product")
               .FirstOrDefault(x => x.Id == id);
}

我已经完成了在网上找到的关于 ASP.NET Core 中多对多关系和存储库模式的教程,但存储库详细信息当然与我现有的站点不同。我尝试将

EventProd
表添加到我的
ApplicationDbContext
文件中,但这没有改变任何内容。

仍在寻找其他示例,看看我是否找到其他线索...再次感谢您的帮助!

entity-framework-core asp.net-core-mvc repository many-to-many
1个回答
0
投票

EF Core 支持基于字符串的导航,但它是属性名称,而不是表名称。所以

.Include("EventProducts.Product")
应该可以工作。

在 EF Core 中,建议使用表达式来引用导航属性,因为它是在编译时验证的,而字符串名称仅在运行时验证。

.Include(x => x.EventProducts).ThenInclude(x => x.Product)

© www.soinside.com 2019 - 2024. All rights reserved.