gpt4 book ai didi

c# - 一个数据库具有多个上下文的 EF Initializer

转载 作者:太空狗 更新时间:2023-10-30 01:06:46 24 4
gpt4 key购买 nike

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

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

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

The model backing the 'ServerContext' context has changed since the database was created. Consider using Code First Migrations to update the database

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

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

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

Database.SetInitializer<NameOfThisContext>(null);

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

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

最佳答案

是的,有界数据库上下文实际上是一种很好的做法。例如,一个基础上下文类,使用到数据库的公共(public)连接,每个子类,使用数据库.SetInitializer(null);按照你的建议。

然后继续并拥有 1 个具有“数据库 View ”的大型上下文,该上下文负责所有迁移,并且只有该上下文应该执行此操作。单一事实来源。

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

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

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

关于c# - 一个数据库具有多个上下文的 EF Initializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com