4

我有一个带有 SQL 数据库的现有应用程序,该数据库已使用数据库优先模型进行编码(每次我有架构更改时都会创建一个 EDMX 文件)。

已经完成了一些额外的开发(支持原始应用程序的 Windows 服务),它使用 EF POCO/DbContext 作为数据层而不是 EF EDMX 文件。没有在 DbContexts 中配置初始化设置,但它们从未修改数据库,因为 DbSet 对象始终与表匹配。

现在,我编写了一个单独的应用程序,它使用现有数据库但只使用它自己的新表,它使用 EF 初始化程序自行创建。我曾认为这是使用 EF Code First 来管理这些新表的好时机。我第一次运行应用程序时一切正常,但现在我从我的一些原始 EF POCO DbContexts(从未使用过初始化程序)中得到了这个错误。

自创建数据库以来,支持“ServerContext”上下文的模型已更改。考虑使用 Code First 迁移来更新数据库

经过一番调查,我发现 EF 将其架构的哈希与某处 sql 服务器中存储的一些哈希进行比较。在上下文实际使用数据库上的初始化程序之前,该值不存在(在我的情况下,直到最近的应用程序添加了它的表)。

现在,我的其他 DbContexts 在读取现在存在的哈希值时抛出错误,并且它与自己的不匹配。使用 EDMX 的 EF 连接没有任何错误。

似乎解决方案是将这条线放在protected override void OnModelCreating(DbModelBuilder modelBuilder)所有遇到问题的 DbContexts 中

Database.SetInitializer<NameOfThisContext>(null);

但是,如果稍后我想编写另一个应用程序并让它首先使用 EF 代码再次创建自己的表,那么现在我将永远无法协调这个理论上甚至更新的上下文和现在导致问题的上下文之间的哈希值.

有没有办法清除 EF 存储在数据库中的哈希?EF 是否足够智能以仅更改在当前上下文中作为 DbSet 存在的表?任何见解表示赞赏。

4

2 回答 2

4

是的,有界数据库上下文实际上是一种很好的做法。例如,一个基本上下文类,要使用与 DB 的公共连接,每个子类都使用 Database.SetInitializer(null); 正如你所建议的。

然后继续并拥有 1 个具有“数据库视图”的大型上下文,该上下文负责所有迁移,并且只有该上下文应该这样做。单一的事实来源。

拥有多个负责数据库迁移的上下文是一场噩梦,我认为您无法解决。弄乱由代码优先迁移创建的系统条目只能以泪水告终。

正是你描述的主题,我在 A julie Lerman 视频中看到。她建议的解决方案是一个单一的“迁移”上下文,然后使用许多有界数据库上下文。

如果您有一个复数帐户: http ://pluralsight.com/training/players/PsodPlayer?author=julie-lerman&name=efarchitecture-m2-boundedcontext&mode=live&clip=11&course=efarchitecture

于 2013-01-14T23:08:08.477 回答
1

你用的是什么EF版本?EF Code First 用于在EdmMetadata表中存储 SSDL 的哈希值。然后在 .NET Framework 4.3 中发生了一些变化,EdmMetadata 表被替换为__MigrationsHistory表(有关更多详细信息,请参阅此博客文章)。但在我看来,您真正关心的是多租户迁移,您可以在其中使用同一个数据库拥有多个上下文。此功能已在EF6中引入- (目前 Aplpha2 版本是公开可用的)另外,请注意 EdmMetadata/__MigrationHistory 表特定于 CodeFirst。如果您使用设计器(模型优先/数据库优先),则不会在数据库中存储其他信息,并且不会检查 EF 模型是否与数据库匹配。这可能导致难以调试错误和/或数据损坏。

于 2013-01-14T23:35:01.317 回答