C# 实体框架使用嵌套属性作为外键

问题描述 投票:0回答:1
public class User {
    public int UserId { get; set; }
    
    public ICollection<Order> Orders { get; set; }
    public ICollection<Order> Sales { get; set; }
}

public class Listing {
    public int ListingId { get; set; }
    
    public int UserId { get; set; }
    public User User { get; set; }
}

public class Order {
    public int ListingId { get; set; }
    public Listing Listing { get; set; }
    
    public int BuyerId { get; set; }
    public User Buyer { get; set; }
}


modelBuilder.Entity<Order>()
    .HasOne(e => e.Buyer)
    .WithMany(e => e.Orders)
    .HasForeignKey(e => e.BuyerId);

modelBuilder.Entity<Order>()
    .HasOne(e => e.Listing.User)
    .WithMany(e => e.Sales)
    .HasForeignKey(e => e.Listing.UserId);

我在配置

User.Sales
属性的关系时遇到问题。

上面的代码应该解释我想要做什么,但是

e.Listing.User
e.Listing.UserId
部分不起作用。

我知道我可以通过向

SellerId
类引入
Seller
Order
属性来解决问题,但这感觉像是浪费,因为这些可以通过
Listing
属性访问,特别是通过
Order.Listing.UserId
Order.Listing.User
分别。

有没有办法配置关系而不需要它?

c# asp.net .net entity-framework entity-framework-core
1个回答
0
投票

从该模型来看,Sales 属于 Listing,而不是 User。用户有许多订单,通过买家链接回来。当谈到已售商品时,这是通过列表进行的。如果您想要一个用户的所有销售额,那么您可以使用:

var salesForUser = context.Orders
    .Where(o => o.Listing.User.UserId == userId)
    .ToList();

...例如。当加载用户并希望立即访问他们的销售时,

.Include(o => o.Listings).ThenInclude(l => l.Sales)

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