我們最近將現有產品切換爲使用實體框架代碼優先遷移。過渡相當痛苦,但我們幾乎已經完成了這一切。既然我們已經在我們的本地環境中運行了一些東西,我們已經將它推送到了我們的部署環境中。不幸的是,我們的部署環境似乎不支持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表現不同的東西?