2012-03-04 43 views
1

我使用EF 4.3 CodeFirst和我有類似這樣的超類型/型號亞型:的EntityFramework 4.3超型晚期初始化

public Person { 
    long Id { get; set; } 
    [Required] 
    string Name { get; set; } 
} 
public Costumer : Person { 
    string SomeData { get; set; } 
    [Required] 
    string SomeRequiredData { get; set; } 
} 

這是問題的一個簡化版本。這些表格有幾個字段。 稍後在應用程序中,一個人可以被「推銷」給Costumer。所以Person首先被創建,然後被轉換爲Customer。

問題是:在我創建Person之後,如何在不創建(或重新創建)新Person記錄的情況下將其「升級」給Vendor? 如果我做的:

var costumer = new Costumer { 
    Id = [same id used before when Person was created], 
    SomeRequiredData = "Data" 
}; 

模型給出了一個錯誤,說需要這個名字。我不應該要求在新Vendor實例中重複Person中的所有必需信息,因爲它已經存在於原始Person記錄中。

任何人都可以幫忙嗎?

P.S.該模型被配置爲創建2個獨立的表格,每一個類...

回答

3

創建人後,我怎麼能「促進」它沒有供應商建立 (或重新創建)一個新的人員記錄?

你最不能與EF,因爲你不能改變現有實例的類型(你可以不投PersonCustomer)。因爲您不能轉換實體,所以您也無法使用EF更新數據庫中的類型。同時,您不能在現有的Id中插入Customer實例,因爲此操作期望插入父類型和子類型(記住Customer是您的模型中的Person,並且因爲插入Customer意味着也插入Person)。

它不起作用的原因是您的域模型是錯誤的。您不應該有Customer作爲Person的子類型,因爲在OOP中,它意味着現在發生的事情 - 您不能在沒有創建新人員實例的情況下將人員更改爲客戶(因爲客戶是一個人)。爲了支持這種情況,您必須只有Person實體,並且此實體必須具有描述其類型的屬性。

+0

謝謝拉迪斯拉夫,這真的是一個將OO建模到數據庫實體的問題。雖然我有兩個表,並且在數據庫的不同時刻創建兩個實體是可以接受的,但不允許使用OO模型。我改變了我的OO模型,在兩個實體之間建立了一對一關係並解決了問題。再次感謝您的提醒。 – 2012-03-06 13:20:55