2013-05-13 114 views
2

如何確保EF爲相同的對象出現生成相同的ID?生成不同ID的相同實體

E.g.如果我有一個類,如:

class Foo{ 
    ICollection<Bar> Bar1; 
    ICollection<Bar> Bar2; 
} 

如果我創建一個新的實體FooBar(未設置ID)的單個實例添加到這兩個Bar1Bar2 - 將它用相同的ID兩個或創建每次都有新的?例如: -

var bar = new Bar(); 
var foo = new Foo{ 
    Bar1 = new List<Bar>(){ bar }; 
    Bar2 = new List<Bar>(){ bar }; 
} 
context.SaveChanges(); 

請問Bar1Bar2包含相同的記錄bar用相同的ID?

更新:如果我有兩個與Equals和哈希碼相同的實例,該怎麼辦?

var first = new Bar(); 
var second = new Bar(); /// first.equals(second) 
var foo = new Foo{ 
    Bar1 = new List<Bar>(){ first }; 
    Bar2 = new List<Bar>(){ second }; 
} 

還是EF沒有檢查等於?

+0

看來你自己試試會更快,不是嗎? – graumanoz 2013-05-13 19:38:50

回答

1

是的,實體框架將爲數據庫中的foobar創建一條記錄。由於兩個列表都包含相同的Bar實例,因此相應的數據庫條目將指向相同的記錄。

+0

謝謝!如果有兩個「Equal」實例呢?查看更新。 – drozzy 2013-05-13 19:03:38

+1

它們是否相等無關緊要:兩個不同的實例=數據庫中的兩條記錄。改變這種情況的唯一方法是在數據庫中有一個觸發器,它根據相同的列值合併行。 – 2013-05-13 19:08:58

+0

EF不關心平等。它只關心同一性(是一個單詞嗎?)I.e.相同的實例將導致一條記錄,不同的實例相同(如Equals()== true)將導致多條記錄。 – 2013-05-13 21:49:41