2014-03-04 60 views
1

我們最近決定首先在我們的一個項目中使用EF6代碼,所以我正在進行範式改變。我非常喜歡EF,但有些事情是如此不同,他們似乎錯了。帶小孩的實體框架

我只想運行社區的方案,看看我是否正確思考。

我們有一個具有相同類型的子實體的實體。

如果我正常保存一個孩子,我只會保存一個新的實體,其父母id設置爲父母的ID。

public class SomeType 
{ 
public id; 
.... 

public virtual IList<SomeType> Children 
} 

顯然標準的做法並不在這裏,因爲我不是手動操縱DB外鍵的工作:在實體世界裏,他們是通過同一類型的導航屬性如下連接。

看來「實體方式」將首先使用DBCcontext和linq來選擇父級,然後將新實體添加到Children列表並保存整個事情。

這是好的和合乎邏輯的 - 但它似乎有點低效率做一個選擇每次我做一個保存。

我是否真的錯過了這裏的東西,我只是需要習慣於不同的思維方式嗎?

謝謝!

+2

您的標題應該是:「實體框架 - 拯救孩子」。 –

+0

看到這個:http://stackoverflow.com/questions/6913771/insert-record-in-child-table-when-parent-record-already-exists-using-entity-fram –

+0

@PaulDraper我不能相信我錯過了那個機會...... :) – americanslon

回答

1

如果我正確地解決了您的問題,那麼您可以並應該將孩子保存爲帶有parentId的簡單的Sometype,就像您不使用實體框架一樣。 EF的automagic不應該爲你造成問題,你也不會違反任何最佳做法。基本上是:如果父實體已經加載到上下文中,通常最好將新實體添加到導航屬性集合(您的案例中的子集,但任何外鍵)。如果父母沒有加載,並且您知道它是ID,請填寫外鍵字段並像以往一樣保存它。

+0

那麼這部分'公共虛擬IList 這個部分怎麼會工作呢。 – americanslon

+0

我假設你知道父母的ID,但它目前沒有加載,所以你只想保存一個實體(一個新的)。你會讓這個新實體的孩子們空着,它沒有孩子。如果父代已經連接到上下文(已加載),那麼您將添加新的實體,但是在加載現有實體時只是爲了添加新實體而已。 –