2009-08-06 82 views
13

假設我在模型中有兩個類:User(映射到USERS表)和PrivilegedUser(繼承User,其他信息存儲在PRIVILEGEDUSERS表中)。實體框架:繼承,更改對象類型

現在,我在USERS(和User的實例)中有一行,並且需要將該用戶轉換爲PrivilegedUser(即在具有相同Id的PRIVILEGEDUSERS中創建記錄)。有沒有辦法做到這一點沒有刪除/插入?

問題是您在模型中沒有PRIVILEGEDUSERS表示法,因此您不能僅創建PrivilegedUser的那部分。


這只是一個例子。 PrivilegedUser可能會有一些折扣或個人經理或另外到普通用戶屬性。同時,還有其他表格需要引用用戶而不管具體的用戶類型。我已經使用Table-per-Type繼承模式實現了它。在數據庫級別,將用戶從一種類型轉換爲另一種類型非常簡單(您只需要從擴展表中插入或刪除記錄)。但在EF中,只有UserSet存儲User和PrivilegedUser對象。這就是爲什麼我問是否有可能用PrivilegedUser替換現有的用戶對象保留現有的Id,並且不刪除USERS表中的記錄。

回答

0

你有兩個表代表用戶似乎是錯誤的。

讓用戶表(對於所有用戶),然後是UserPrivileges表,它們代表他們被允許做什麼會不會更好?這樣,不需要刪除/插入,並且您可以僅爲用戶引用一個表。

第三個表可用於表示實際特權。

用戶
標識用戶名...

UserPrivileges
用戶ID PrivilegeId

特權
Id描述

+1

這是正確的。一個實例應該/永遠不能改變類型。那麼當用戶變爲特權或非特權時會發生什麼? – 2009-08-06 15:20:08

+0

@克雷格,有什麼消息嗎?我遇到了同樣的問題。 – Shimmy 2011-01-23 03:01:10

+0

@Shimmy,「新聞?」什麼新消息?如果你認爲你的對象需要改變類型,那麼你可能會誤用繼承。 @丹丹的回答仍然是一個更好的主意。 – 2011-01-23 03:26:24

3

你就是不行。

正如this article所解釋的那樣,EF(3.5)不支持此功能。您必須使用存儲過程來完成此操作。

1

你需要改變你的世界觀。您的觀點是您擁有標準權限的標準用戶和具有額外權限的超級用戶。這些權限沒有枚舉,它們是隱含的。

新的世界觀是你保持所有特權的列表,包括標準和超級,然後在映射表中創建一個多對多的地圖,哪些用戶擁有哪些特權。當用戶被授予超級權限時,您只需爲映射表添加相應權限的映射即可。您不需要PrivilegedUser類,只需要User類中的特權列表。權限可以是標準或超級。