我们最近将现有产品转换为使用Entity Framework Code First Migrations。这种转变相当痛苦,但此时我们已经完成了几乎所有的转变。现在我们已经在我们的本地环境中工作了,我们已经把它推到了我们的部署环境中。遗憾的是,我们的部署环境似乎不支持使用新的EF迁移进行 SOMETHING 。
我们的环境包括两个服务器:Web(.Net MVC3)服务器和套接字服务器,两者都在Windows Azure中运行。问题似乎只出现在我们的套接字服务器中,事实上,实体框架告诉我们数据库哈希不匹配(使用context.Database.CompatibleWithModel()
)。
如果我们忽略了EF告诉我们我们的数据库模型与我们的代码模型不匹配的事实,我们遇到的唯一错误是插入一个带有复合键的实体对象。可以很好地创建所有其他实体。我们所有的实体类都派生自一个基类:
class BaseEntity {
[HiddenInput(DisplayValue = false)]
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual long Id { get; set; }
}
我们必须添加'Order'部分,以便EF支持复合键。遇到问题的模型如下:
class SubEntity {
[MaxLength(255)]
[Required]
[Key, Column(Order = 1)]
public string Name { get; set; }
}
当我们尝试将新的SubEntity
对象添加到上下文并保存更改时,我们从SQL中收到一条错误,指出我们无法设置显式Id
并使用{{1} }。
代码在我们的本地计算机和我们的Web服务器上运行良好。 DB模型是兼容的,我们可以毫无问题地创建“SubEntity”对象。
对我来说,在套接字服务器环境中,EF似乎在使用复合键时忽略IDENTITY_INSERT ON
注释。这可以解释错误,并解释为什么DB模型不兼容。这有意义吗?环境中是否存在使EF表现不同的东西?
答案 0 :(得分:1)
在我的{桌子,墙壁,同事拳头}击打我4天后,我终于找到了问题的解决方案(即使我不明白)。
同样,这只发生在我们在Windows Azure环境中运行服务器时(在我们的本地环境中不会发生),并且显然只有在我们的套接字服务器(ExitGames中的Photon)中运行时才会发生。
由于某种原因,注释[HiddenInput(DisplayValue = false)]
(它是一个MVC注释(因此不应该影响我们的Photon服务器))导致EntityFramework表示Id
属性不存在SubEntity
上课。
删除HiddenInput
属性可解决问题。所以,虽然它是“固定的”,但我仍然不明白为什么。