将分离的对象添加到 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 对象设置为我从数据库中显式拉取的对象。有没有办法可以正确附加这个分离的对象?
不要设置
LoadCarrier 的 Carrier 属性,而只设置 CarrierId。这足以让 EF 知道它必须将外键设置为现有记录。
还有其他方法可以做到这一点,但由于承运人是分离的,因此最好保持连接,而不是首先将其拉入。我想你正在预装未跟踪的载体,因为它们是固定的。