将分离的对象添加到 EF 6

本文关键字:EF 添加 对象 分离 | 更新日期: 2023-09-27 17:57:18

我有一个具有许多不同属性的分离对象。其中一些属性在某些时候需要"附加",以便 EF 不会尝试将它们插入到数据库中。

public partial class Load 
{
    public virtual int Id {get;set;}
    [Required]
    public virtual int CustomerId { get; set; }
    [ForeignKey("CustomerId")]
    public virtual Customer Customer { get; set; }
    [Required]
    public virtual long CreatedByApplicationUserId { get; set; }
    [ForeignKey("CreatedByApplicationUserId")]
    public virtual ApplicationUser CreatedByApplicationUser { get; set; }
    public virtual long? ModifiedByApplicationUserId { get; set; }
    [ForeignKey("ModifiedByApplicationUserId")]
    public virtual ApplicationUser ModifiedByApplicationUser { get; set; }
    public virtual long? CoveredByApplicationUserId { get; set; }
    [ForeignKey("CoveredByApplicationUserId")]
    public virtual ApplicationUser CoveredByApplicationUser { get; set; }
    public virtual bool IsNetworkLoad { get; set; }
    public virtual bool IsExport { get; set; }
    public virtual bool CanTrackLoad { get; set; }
    [Required]
    public virtual DateTime CreatedDateTime { get; set; }
    public virtual DateTime? ModifiedDateTime { get; set; }
    public virtual string BillingReferenceNumber { get; set; }
    [Required]
    public virtual int LoadStatusId { get; set; }
    [ForeignKey("LoadStatusId")]
    public virtual LoadStatus LoadStatus { get; set; }
    public virtual Freight Freight { get; set; }
    public virtual ICollection<LoadOrigin> LoadOrigins { get; set; }
    public virtual ICollection<LoadDestination> LoadDestinations { get; set; }
    public virtual ICollection<LoadNote> LoadNotes { get; set; }
    public virtual ICollection<LoadCarrier> LoadCarriers { get; set; }
}

以我的财产 LoadCarry 为例。LoadCarry 有一个属性 Carrier,该属性是从没有跟踪的数据库填充的。

public partial class LoadCarrier
{
    public virtual int Id {get;set;}
    public virtual bool IsDispatched { get; set; }
    public virtual bool IsPrimary { get; set; }
    [MaxLength(25)]
    public virtual string CarrierProNumber { get; set; }
    [MaxLength(1000)]
    public virtual string RCNotes { get; set; }
    [Required]
    public virtual int CarrierId { get; set; }
    [ForeignKey("CarrierId")]
    public virtual Carrier Carrier { get; set; }
    [MaxLength(50)]
    [Required]
    public virtual string Dispatcher { get; set; }
    public virtual long LoadId { get; set; }
    [ForeignKey("LoadId")]
    public virtual Load Load { get; set; }
    public virtual LoadDriver LoadDriver { get; set; }
}

正确填充对象后,我尝试保存到数据库。由于这些对象都是分离的,因此保存失败,因为我对 Carrier 对象的成员具有唯一的约束,因为 EF 错误地尝试插入数据库中已存在的对象。

    public virtual int Create(T entity, long userId)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }
        dbSet.Add(entity);
        return context.SaveChanges(userId);
    }

我已经尝试了几次将运营商对象的状态更改为"未更改",但是我得到了重复的主键异常。我还尝试将 Load 对象添加到上下文中,然后将 Carrier 对象设置为我从数据库中显式拉取的对象。有没有办法可以正确附加这个分离的对象?

将分离的对象添加到 EF 6

不要设置

LoadCarrier 的 Carrier 属性,而只设置 CarrierId。这足以让 EF 知道它必须将外键设置为现有记录。

还有其他方法可以做到这一点,但由于承运人是分离的,因此最好保持连接,而不是首先将其拉入。我想你正在预装未跟踪的载体,因为它们是固定的。