c# – 具有多个上下文的EF初始化程序,用于一个数据库
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 具有多个上下文的EF初始化程序,用于一个数据库,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1957字,纯文字阅读大概需要3分钟。
内容图文
![c# – 具有多个上下文的EF初始化程序,用于一个数据库](/upload/InfoBanner/zyjiaocheng/908/761eda34e61c418186ab0201f48b27b6.jpg)
我有一个SQL数据库的现有应用程序,该数据库已使用数据库第一模型进行编码(每次我更改架构时都会创建一个EDMX文件).
已经完成了一些额外的开发(支持原始应用程序的Windows服务),它使用EF POCO / DbContext作为数据层而不是EF EDMX文件.在DbContexts中没有配置初始化程序设置,但它们从未修改数据库,因为DbSet对象始终与表匹配.
现在,我编写了一个单独的应用程序,它使用现有的数据库,但只使用自己的新表,它使用EFs初始化程序自行创建.我原以为这是使用EF Code First处理这些新表的好时机.我第一次运行应用程序时一切正常,但现在我从我的一些原始EF POCO DbContexts(从未使用过初始化程序)中收到此错误.
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中某些存储的哈希值进行了比较.在上下文实际上在数据库上使用初始化程序之前,该值不存在(在我的情况下,直到最近的应用程序添加其表).
现在,我的其他DbContexts会在读取现有哈希值时抛出错误,并且它与自己的哈希值不匹配.使用EDMX的EF连接没有任何错误.
似乎解决方案是在遇到问题的所有DbContexts中将此行置于受保护的覆盖void OnModelCreating(DbModelBuilder modelBuilder)中
Database.SetInitializer<NameOfThisContext>(null);
但是,如果以后我想编写另一个应用程序并让它首先使用EF代码创建自己的表,那么现在我将永远无法协调这个理论上更新的上下文与现在导致问题的上下文之间的哈希值. .
有没有办法清除EF存储在数据库中的哈希? EF足够聪明,只能改变当前上下文中作为DbSet存在的表吗?任何见解都表示赞赏.
解决方法:
您使用的EF版本是什么? EF Code First用于在EdmMetadata表中存储SSDL的哈希值.然后在.NET Framework 4.3中,thingh改变了一点,EdmMetadata表被__MigrationsHistory表替换(有关详细信息,请参阅this blog post).但在我看来,你真正关注的是multi-tenant migrations,你可以使用同一个数据库拥有多个上下文.此功能已在EF6中引入 – (目前Aplpha2版本是公开的)另外,请注意EdmMetadata / __ MigrationHistory表是特定于CodeFirst的.如果您正在使用设计器(模型优先/数据库优先),则不会在数据库中存储其他信息,也不会检查EF模型是否与数据库匹配.这可能导致难以调试错误和/或数据损坏.
内容总结
以上是互联网集市为您收集整理的c# – 具有多个上下文的EF初始化程序,用于一个数据库全部内容,希望文章能够帮你解决c# – 具有多个上下文的EF初始化程序,用于一个数据库所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。