C# 实体框架两个复合外键指向同一个表,backref关系不起作用

C# 实体框架两个复合外键指向同一个表,backref关系不起作用,c#,entity-framework,C#,Entity Framework,我有两节课 公共类拍卖模型 { [关键] 公共int Id{get;set;} 公共虚拟用户模型卖方{get;set;} 公共字符串SellerUsername{get;set;} 公共字符串SellerSiteName{get;set;} 公共字符串CurrentWinnerUsername{get;set;} 公共字符串CurrentWinnerSiteName{get;set;} 公共虚拟用户模型CurrentWinner{get;set;} } 及 加载包含的数据,加载关系。这有点出乎

我有两节课

公共类拍卖模型
{
[关键]
公共int Id{get;set;}
公共虚拟用户模型卖方{get;set;}
公共字符串SellerUsername{get;set;}
公共字符串SellerSiteName{get;set;}
公共字符串CurrentWinnerUsername{get;set;}
公共字符串CurrentWinnerSiteName{get;set;}
公共虚拟用户模型CurrentWinner{get;set;}
}

加载包含的数据,加载关系。这有点出乎意料,但即使我将关系更改为

    public virtual List<AuctionModel> MyAuctions { get; set; }
    public virtual List<AuctionModel> WinningAuctions { get; set; }
公共虚拟列表MyAuctions{get;set;}
公共虚拟列表WinningActions{get;set;}

我仍然必须使用Include,否则将得到null。这对我来说真的没有意义。

所以我不完全确定如何使用Fluent API解决这个问题,但下面是如何使用数据注释:

public class AuctionModel
{
    [Key]
    public int Id { get; set; }

    [Required, ForeignKey("Seller"), Column(Order = 2)]
    public string SellerUsername { get; set; }

    [Required, ForeignKey("Seller"), Column(Order = 3)]
    public string SellerSiteName { get; set; }

    [ForeignKey("CurrentWinner"), Column(Order = 4)]
    public string CurrentWinnerUsername { get; set; }

    [ForeignKey("CurrentWinner"), Column(Order = 5)]
    public string CurrentWinnerSiteName { get; set; }

    public virtual UserModel Seller { get; set; }
    public virtual UserModel CurrentWinner { get; set; }
}

发生这种情况是因为这是告诉EF加载数据的方式。要加载拍卖和WinningAuctions属性,您需要使用
include
方法(称为热切加载)指定要包含的内容,然后明确说明:

如果将收藏属性更改为
virtual
,则无需执行包含操作

public class UserModel
{
    public virtual List<AuctionModel> Auctions { get; set; }
    public virtual List<AuctionModel> WinningAuctions { get; set; }
}
公共类用户模型
{
公共虚拟列表

更新
如果延迟加载行为仍然不起作用,您需要检查您的模型类是否满足创建代理类所需的EF条件。看看这个。

问题在于,这两个集合应该是ICollection而不是IList

SiteName不应该在FK中放在第一位,因为它在列中是第一位的吗订单?我试图切换FK订单,但没有,这没有解决问题。P的问题是,在集合中根本找不到实体。如果没有返回任何内容,则加载类型无关紧要。第一部分工作正常(很抱歉否决,我将在接下来的18小时内更正此问题),但第二个不行!我无法理解为什么,从我在你链接的文档中读到的内容来看,它应该是。你知道你是否启用了延迟加载行为吗?它在我的测试项目中起作用Hello@IronMan84,你确定他的模型配置不起作用吗?我创建了一些用户,后来又创建了一些拍卖,以及它们之间的关系这两个实体正在工作并在数据库中持久化。它们可能工作,也可能不工作,我不知道。我没有花太多时间玩弄Fluent API,这就是为什么我在数据注释中发布了如何实现它的原因。因此,我在回答中建议考虑EF加载数据的方式。我使用INCLUDE对一些数据进行测试des和它工作,但不使用
Include
不会使集合为空。
Include
只告诉EF立即加载实体。但是为什么如果我使用Include加载属性,当我删除属性时却不这样做呢
    public virtual List<AuctionModel> MyAuctions { get; set; }
    public virtual List<AuctionModel> WinningAuctions { get; set; }
public class AuctionModel
{
    [Key]
    public int Id { get; set; }

    [Required, ForeignKey("Seller"), Column(Order = 2)]
    public string SellerUsername { get; set; }

    [Required, ForeignKey("Seller"), Column(Order = 3)]
    public string SellerSiteName { get; set; }

    [ForeignKey("CurrentWinner"), Column(Order = 4)]
    public string CurrentWinnerUsername { get; set; }

    [ForeignKey("CurrentWinner"), Column(Order = 5)]
    public string CurrentWinnerSiteName { get; set; }

    public virtual UserModel Seller { get; set; }
    public virtual UserModel CurrentWinner { get; set; }
}
var usertest = db.Users.Include(u => u.WinningAuctions).Include(u => u.Auctions).FirstOrDefault(u => u.Username == "Albert" && u.SiteName == "localhost");
public class UserModel
{
    public virtual List<AuctionModel> Auctions { get; set; }
    public virtual List<AuctionModel> WinningAuctions { get; set; }
}