使用 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
文件中,但这没有改变任何内容。
仍在寻找其他示例,看看我是否找到其他线索...再次感谢您的帮助!
EF Core 支持基于字符串的导航,但它是属性名称,而不是表名称。所以
.Include("EventProducts.Product")
应该可以工作。
在 EF Core 中,建议使用表达式来引用导航属性,因为它是在编译时验证的,而字符串名称仅在运行时验证。
.Include(x => x.EventProducts).ThenInclude(x => x.Product)