San*_*der 5 c# entity-framework
也许是一个奇怪的问题,但我们有一个场景,我们希望在一个环境中使用实体框架代码优先,该环境可能有一个比代码本身更新/更高版本的数据库。
让我详细说明一下。我们有几个解决方案,它们都使用一个核心程序集,其中包含所有解决方案正在使用的整体数据模型。解决方案主要是部署到多个不同 Azure 网站的站点和应用程序。所以解决方案彼此相邻运行。他们唯一共享的是 Azure 数据库。
现在这个场景将发挥作用。当我们更新核心程序集中的数据库模型并更新 Azure 中的解决方案之一时。在该解决方案中加载模型时,将更新基础数据库。没问题,就像一个魅力......
当加载其他解决方案之一时,问题就开始了。这些其他解决方案仍在使用以前的核心程序集,与它们所连接的数据库模型相比,该程序集现在具有过时的 EF CF 模型。所以会抛出一个很好的异常,如下所示。
自数据库创建以来,支持“{NAME}”上下文的模型已更改。手动删除/更新数据库,或使用 IDatabaseInitializer 实例调用 Database.SetInitializer。例如,DropCreateDatabaseIfModelChanges 策略将自动删除并重新创建数据库,并可选择使用新数据为其播种。
问题是我们是否可以强制模型只加载并忽略数据库中所做的更改。我们内部有一个政策,只在数据库中应用不破坏性的更改,因此模型应该能够毫无问题地加载。
预先感谢您提供的信息和提示!
我可能是错的(不确定我是否记得正确),但如果它不干扰您的应用程序配置,您可以将 DB 初始值设定项设置为 null:
public PortalDbContext()
: base("name=PortalConnectionString")
{
Database.SetInitializer<PortalDbContext>(null);
}
Run Code Online (Sandbox Code Playgroud)
或者可以创建自定义初始化程序:
public class BlogContextCustomInitializer : IDatabaseInitializer<BlogContext>
{
public void InitializeDatabase(BlogContext context)
{
if (context.Database.Exists())
{
if (!context.Database.CompatibleWithModel(true))
{
// Do something...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |