集合的共享主键关联

本文关键字:关联 共享 集合 | 更新日期: 2023-09-27 18:26:15

我有以下实体:

public class User
{
    [Key]
    public int UserId { get; set; }
    virtual public ICollection<Transaction> Transactions { get; set; }
}
public class Transaction
{
    [Key]
    public Int64 TransactionId { get; set; }
    [Required]
    public virtual User Sender {get; set;}
    public virtual User Receiver { get; set; }
}

在流利的API 中描述了这种关系

modelBuilder.Entity<User>()
            .HasMany(r => r.Transactions)
            .WithRequired(s => s.Sender);
modelBuilder.Entity<User>()
            .HasMany(r => r.Transactions)
            .WithOptional(r => r.Receiver);

有两个用户,一个是交易的发送方,另一个是接收方。现在,当我向第一个用户添加事务时,一切都正常。当第二个用户接受该事务,并且我将同一事务添加到其事务的ICollection时,它会神奇地从第一个用户中消失,反之亦然。换句话说,EF阻止我在双亲中引用同一实体。周围有路吗?

集合的共享主键关联

您的用户类中需要有两个导航属性。

public class User
{
    [Key]
    public int UserId { get; set; }
    virtual public ICollection<Transaction> SenderTransactions { get; set; }
    virtual public ICollection<Transaction> ReceiverTransactions { get; set; }
}

每个导航属性在相关类中都必须具有等效的导航属性。

modelBuilder.Entity<User>()
            .HasMany(r => r.SenderTransactions)
            .WithRequired(s => s.Sender);
modelBuilder.Entity<User>()
            .HasMany(r => r.ReceiverTransactions)
            .WithOptional(r => r.Receiver);