2015-06-20 73 views
0

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

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; } 

} 

以我的属性LoadCarries为例。 LoadCarries有一个属性载体,从数据库中填充而没有跟踪。

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; } 
} 

一旦我有我的对象正确填充,我尝试保存到分贝。由于这些对象都被分离,所以保存失败,因为我对Carriers对象的成员有一个唯一的约束,因为EF不正确地尝试插入一个已经存在于db中的对象。

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

我曾多次试图改变运营商的国家反对“不变”,但我得到一个重复的主键例外。我也尝试将Load对象添加到上下文中,然后将Carrier对象设置为我明确从数据库中提取的对象。有没有办法让我可以正确地附加这个分离的对象?

回答

0

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

还有其他的方法可以做到这一点,但由于承运人是分离的,所以最好保持它的连接并且不要把它放在首位。我想你是在预先装载运载工具,因为它们是固定的。

+0

我也试过这种方法。当我使用dbSet.Add(实体)EF从数据库填充LoadCarrier但仍尝试插入载体表。问题可能在于LoadCarrier是应该插入的新对象,但不应插入其成员Carrier,并且LoadCarrier应向Carrier提供外键。 – JasonlPrice

+0

正如我所说的,您不要设置导航属性,而是设置外键值。因此不会发生插入。 –

+0

这就是我所说的我尝试过的。 http://snag.gy/YO9TE.jpg。 您可以看到Carrier对象为空,但设置了外键CarrierId。 – JasonlPrice