2012-10-16 82 views
0

我們最近將現有產品切換爲使用實體框架代碼優先遷移。過渡相當痛苦,但我們幾乎已經完成了這一切。既然我們已經在我們的本地環境中運行了一些東西,我們已經將它推送到了我們的部署環境中。不幸的是,我們的部署環境似乎不支持SOMETHING與新的EF遷移。實體框架使用組合鍵設置標識值Azure SQL

我們的環境由兩臺服務器組成:一臺Web(.Net MVC3)服務器和一臺套接字服務器,兩臺服務器都運行在Windows Azure中。這個問題似乎只發生在我們的套接字服務器中,實際上Entity Framework告訴我們數據庫哈希不匹配(使用context.Database.CompatibleWithModel())。

如果我們忽視的事實是EF告訴我們,我們的DB模式不符合我們的代碼模型中,我們遇到的唯一的錯誤是一個複合鍵一個實體對象的插入。所有其他實體可以創建好。我們所有的實體類都來自基類:

class BaseEntity { 
    [HiddenInput(DisplayValue = false)] 
    [Key, Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual long Id { get; set; } 
} 

爲了EF支持組合鍵,我們必須添加'Order'部分。這是有問題的模式是這樣的:

class SubEntity { 
    [MaxLength(255)] 
    [Required] 
    [Key, Column(Order = 1)] 
    public string Name { get; set; } 
} 

當我們試圖將一個新的SubEntity對象添加到上下文並保存更改,我們從SQL說,我們不能設定一個明確的Id得到一個錯誤,並使用IDENTITY_INSERT ON

該代碼在我們的本地計算機和我們的Web服務器上正常工作。數據庫模型是兼容的,我們可以創建'SubEntity'對象而沒有問題。

對我來說,在套接字服務器環境中,EF似乎在使用組合鍵時忽略了[DatabaseGenerated]註釋。這將解釋錯誤,並解釋爲什麼數據庫模型不兼容。這有意義嗎?環境中是否有能夠使EF表現不同的東西?

回答

1

經過4天的對我的{桌子,牆壁,同事的拳頭}的擊敗我的頭後,我終於找到了解決問題的辦法(即使我不明白它)。

同樣,這隻發生在我們在Windows Azure環境中運行服務器時(不會發生在我們的本地環境中),顯然它只發生在運行在我們的套接字服務器(Photon by ExitGames)時。

出於某種原因,註釋[HiddenInput(DisplayValue = false)],這是一個MVC註釋(因此不應該影響我們的光子服務器)導致的EntityFramework說,Id屬性不爲SubEntity類存在。

刪除HiddenInput屬性可修復問題。所以,儘管它是「固定的」,但我仍然不明白爲什麼。