2012-11-21 87 views
1

我使用EF5和Code-First。轉換實體框架中的類

我有一個叫做FooBase的抽象基類。 Foo1和Foo2都從FooBase繼承。我使用基於名爲Bar的Discriminator的EF映射配置。因此,如果Bar = someValue,則創建Foo1 ...如果Bar是另一個值,則創建Foo2。

由於Bar是一個鑑別器,我沒有訪問它作爲任何Foo類的屬性。

我現在有必要將Foo1的實例轉換爲Foo2。我使用反射並將合適的屬性移動到新實例,包括Foo1的關鍵值。這是一個確切的副本,除了它是一個不同的類型。我更改EntityState進行修改並保存到數據庫。

但是,數據庫中的鑑別器值沒有得到更新。它仍然保持與Foo1一樣的價值。

我可以猜測,因爲enitity只設置爲修改,EF不會檢查鑑別器。

有沒有人知道解決這個問題的方法?

回答

2

您不能將現有實例更改爲其他類型。與鍵值關聯的實體的類型是不可變的。如果您想從Foo1創建Foo2,則需要使用新的鍵值創建新實例並將其插入數據庫。只是修改將永遠保持關鍵和鑑別。

如果您認真需要更改類型並保留密鑰繼承不是您的解決方案。將關鍵等同於引用,並將鑑別符等同於.NET中的類型 - 您不能更改現有引用的類型。