2

下面是一個簡單的例子。使用實體框架代碼優先,如何插入具有現有屬性的對象

我有這樣定義的Customer記錄:

public class Customer 
    { 
     [Key] 
     public string Id { get;} 
     public UsState UsState { get; set; } 
    } 

public class UsState 
    { 
     [Key] 
     public string StateAbbreviation {get;set;} 
     public string StateName {get;set;} 
    } 

我已經有我UsState的人口與50個州,現在我要插入栓到現有狀態的一個Customer記錄。

如果我這樣說:

Customer customer = new Customer() 
      { 
       UsState = "CA", 
       Id = 1001 
      } 
dbContext.Customers.add(customer); 

我得到一個錯誤說國家正試圖重新插入。

如何獲得添加使用現有狀態,而不是嘗試並重新插入它。我真正的問題有很多可能存在的嵌套對象,所以我需要通常解決這個問題。

感謝

回答

2

兩種方式我所知道的是:

  1. 設置EntityState到什麼是適合你的行動或

  2. 從數據庫中獲取UsState並將其添加到客戶的權利在保存之前,這會給它一個UnModified的EntityState或類似的東西。

改變EntityState你需要得到你的DbContext的ObjectContext的像顯示在這個線程:Entity Framework Code First - No Detach() method on DbContext

+0

您好Joakim,我不是想要密集,但我只是沒有從文章中得到我需要做什麼,我需要什麼。我從頭開始插入UsState存在的記錄,但記錄的其餘部分不記錄。也就是說,我有dbContext.Customers.add(客戶)。我不明白如何附加或分離客戶。 (顯然)我不是EF精靈。我也無法弄清楚如何做你的#1建議。我嘗試去做db.UsStates.where(...)。firstordefault()並將它分配給Customer.UsState,但是沒有奏效(關於重複插入的相同錯誤) – 2012-01-15 02:00:15

+0

實際上Joakim,你的#1確實工作。我很困惑,因爲我測試的第一條記錄實際上並不存在於UsState表中。我對#2感興趣,這聽起來像是一個更一般的解決方案。如果你能幫我解釋一下,我會很感激。我沒有得到這個帖子。 - 謝謝 – 2012-01-15 02:05:26

+0

@PeterKellner我的第二個意思是,你使用某種ID從數據庫中獲取UsState,並將該實體添加到客戶。在#1中,我們承擔責任並告訴EF即使它不存在也是存在的。 – Joakim 2012-01-15 04:18:06

0

如果您在表數據方面想一想,你的客戶表中應該有一列其中描述了客戶的狀態。你也有一個狀態表,你可以用它們連接在一起得到狀態名。

CREATE TABLE customer (
    id VARCHAR(10), 
    state CHAR(2) 
) 

CREATE TABLE state (
    stateabbreviation CHAR(2), 
    statename VARCHAR(50) 
) 

「狀態」列只是表示狀態的字符串。所以,你的類應定義相同的方式,以及ID和一個國家,如果你想包括您的USState類的信息,明確定義類型UsState與一個ForeignKey屬性:

public class Customer 
{ 
    [Key] 
    public string Id { get;} 
    public string State { get; set; } 
    [ForeignKey("State")] 
    public UsState UsState { get; set; } 
} 

然後,當您創建新記錄時,請設置字符串的文本,而不是UsState對象。

Customer customer = new Customer() 
{ 
    State = "CA", 
    Id = 1001 
} 
dbContext.Customers.add(customer); 
+0

事實上,我不確定新調用中的UsState =「CA」是如何不會導致錯誤的,因爲UsState是一個類,而不是一個字符串。 – 2012-01-15 01:22:23

+0

然後你應該閱讀這個:http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx取決於你做什麼非常有用。 – Joakim 2012-01-15 01:25:38

+0

嗨斯科特,你是對的,它沒有工作。我的意思是我有一個函數調用GetUsState(「CA」),它返回了狀態對象。我會嘗試你的建議。看起來很奇怪,應該爲狀態創建一個重複的字符串,以便按照我想要的方式工作。 – 2012-01-15 01:25:59

相關問題