2016-01-23 97 views
0

我有一個對象有兩個子對象: 對象是一個客戶。其中一個子對象是一個國家,例如:customer.Country = country; 國家表格不可更改。顧客表是可變的。 我嘗試添加使用EF一個新的客戶:添加與子對象的對象

Context.Customers.Attach(customer); 
Context.Entry(customer).State = EntityState.Added;   
var newEntry = DbSet.Add(customer); 
return Context.SaveChanges() > 0 

而且它的第testings期間正常工作。但是由於一些奇怪的原因,它不再起作用了:它說子對象已經存在於數據庫中。 這段代碼有什麼問題,請指教?

PS 我已經解決了與下面的代碼這個問題:

Context.Countries.Attach(customer.Country); 
var newEntry = DbSet.Add(customer); 
Context.SaveChanges(); 

但我不能完全肯定,如果這是正確的

PPS 只需再次測試了第二種方法,它失敗了,雖然它工作得很好......這很奇怪......

+0

第二種方法出現錯誤嗎? –

回答

0

如果你添加一個帶有子元素的元素,子元素也會被添加到數據庫中。如果您添加一個新的客戶使用相同的子元素,EF將嘗試再次添加子元素,這會(當然會失敗)。

如果你有一個子元素,需要被分配到一個新的元素(例如國家對客戶),你需要從數據庫中加載的子元素是這樣的:

Country country = Context.Countries.Find(countryId); 
customer.Country = country; 
Context.Customers.Add(customer); 
Context.SaveChanges(); 
+0

我知道這種方法,但我認爲這是錯誤的。我們應該使用附件或國家的東西 –

+0

爲什麼這是錯的? 'Add'在集合中添加一個新元素,並在內部設置要附加的狀態。 –

+0

恐怕它會被認爲是不好的代碼,這是我試圖避免的東西 –

0

要將一個對象添加到entityframework中的表中,您可以執行以下任一操作。

var country = Context.Countries.First(x => x.Id == 1); 
customer.Country = country; 

Context.Customers.Add(customer); 

剛剛致電Context.SaveChanges()並將實體添加到數據庫中。

+0

不,它會在對象沒有子對象時起作用。就我而言,我無法添加子對象的副本。 –

+0

@ J.Doe我剛剛更新了我的答案,以保存客戶與國家 –

+0

恐怕這將被視爲錯誤的代碼。我發現有必要使用附加/狀態的東西,但由於一些奇怪的原因,它們只能工作一次...... –