2017-06-17 57 views
0

我在C#上使用localDB,某些類(上下文類)具有屬於另一個類的屬性,但是當我堅持該對象時,他不僅保存屬性類(class_id)的引用,而且再次重複整個屬性類。 (堅持boths)C#爲什麼在保存時複製對象記錄?

public class Item 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public String Name { get; set; } 
} 

public class Order 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Item Item { get; set; } 
} 

兩個類有做基本相同的例行堅持一個額外的控制類:

public void SaveObjeto(ObjectClass object) 
    { 
     if (object.Id == 0) 
     { 
      ctx.Objects.Add(objeto); 
     } 
     else 
     { 
      var temp = ctx.Objects.SingleOrDefault(
          temp => temp.Id == objeto.Id 
         ); 
      temp.Id = objeto.Id; 
      temp.Attribute = objeto.Attribute; 
     } 

     ctx.SaveChanges(); 
    } 

我使用LINQ表達式來進行持續。

實施例之實踐:

  • 我已經類的Item1阱上的LocalDB堅持;
  • 然後,我嘗試堅持具有屬性Item1的類Order1
  • 當堅持Order1時,他們在LocalDB上創建另一條記錄作爲Item1(clone?),而不是僅引用已持久化的Item1;
  • 最後,我用兩個Item1持久保存在LocalDB上。

爲什麼?

回答

0

看起來您每次創建新的Order實例時,都會使用Item1的新實例(可能與數據庫中持久記錄的ID相同)。但是,EF會將其作爲新添加的對象進行追蹤。有幾個選項:

  1. 加載項目1從DB上下文和使用它的財產在訂單實例,它可以讓EF知道該實體在TBE數據庫已經持續分配。

  2. 將Item1明確標記爲Unchanged/Detached,以便EF將跳過它。

    ctx.Entry(order.Item).State = System.Data.Entity.EntityState.Unchanged; 
    
+0

謝謝,我要去給了論文提示了一槍。 –

+0

這兩個解決方案對我來說都很好,我會用第二個解決方案,因爲適合我的項目。謝謝你。 –

+0

但是,當對象屬性仍然具有更多的對象屬性時,最好將他從上下文中再次恢復,而不是將其標記爲未更改。 –

相關問題