0

我们最近将现有产品切换为使用实体框架代码优先迁移。过渡过程相当痛苦,但目前我们已经完成了几乎所有的过程。现在我们已经在我们的本地环境中工作了,我们已经将它推到了我们的部署环境中。不幸的是,我们的部署环境似乎不支持新的EF迁移。

我们的环境由两个服务器组成:一个 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 支持复合键,我们必须添加“订单”部分。有问题的模型如下所示:

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

当我们尝试将新SubEntity对象添加到上下文并保存更改时,我们会从 SQL 中得到一个错误,指出我们无法设置显式Id, 并使用IDENTITY_INSERT ON.

该代码在我们的本地机器和我们的 Web 服务器上运行良好。DB 模型是兼容的,我们可以毫无问题地创建“子实体”对象。

对我来说,在套接字服务器环境中,EF 似乎[DatabaseGenerated]在使用复合键时忽略了注释。这将解释错误,并解释为什么 DB 模型不兼容。这有意义吗?环境中是否存在会使 EF 表现不同的东西?

4

1 回答 1

1

在用我的头撞我的{桌子、墙壁、同事的拳头} 4 天后,我终于找到了解决问题的方法(尽管我不明白)。

同样,这只发生在我们在 Windows Azure 环境中运行服务器时(不会发生在我们的本地环境中),显然它只发生在我们的套接字服务器中运行时(ExitGames 的 Photon)。

由于某种原因,注释[HiddenInput(DisplayValue = false)],它是一个 MVC 注释(因此不应该影响我们的 Photon 服务器)导致 EntityFramework 说该类Id不存在该属性SubEntity

删除HiddenInput属性可以解决问题。所以,虽然它是“固定的”,但我仍然不明白为什么。

于 2012-10-19T20:03:56.477 回答