2015-06-20 70 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