实体框架代码首先在外部SQL服务器上

本文关键字:外部 SQL 服务器 框架 代码 实体 | 更新日期: 2023-09-27 18:05:17

我遵循实体框架教程:链接

我已经下载了源代码,并运行。项目工作正常(使用默认连接字符串)。

<add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />

下一步,我已经改变了连接字符串连接到远程服务器(成功连接)。但是,表没有创建,当运行应用程序并访问控制器时,我得到以下错误:

错误:

Model compatibility cannot be checked because the database does not contain 
model metadata. Model compatibility can only be checked for databases created 
using Code First or Code First Migrations.

我的数据库用户是'dbowner',所以我不会想象这是数据库访问问题。

我是EF的新手,对代码优先迁移了解不多。您遇到过上面的错误吗?代码迁移会解决这个问题吗?如果是,为什么呢?

实体框架代码首先在外部SQL服务器上

根据我的阅读(如果我错了请纠正我),这里的场景是您希望将EF代码优先工作放入远程服务器上的现有(可能是空的)数据库。

错误的出现是因为,我认为,EF正在寻找一个_MigrationHistory表(关于EF代码优先迁移已经针对它运行的元数据等),并且找不到它。这里有一些关于这个表的合理的介绍,供一些背景/兴趣阅读。

所以要解决这个问题,我认为应该采取的步骤是:

  1. 初始化你的数据库,使它承认EF代码优先的东西
  2. 更新数据库,将所有迁移前滚到日期

我在这里找到了一些关于如何做到这一点的很好的报道。这个博客也有一些很好的关于EF主题的报道

p。我猜你的。dsf/SQL精简版数据库不会有这个问题,因为EF代码优先会在第一次运行时为你创建它,所以它已经被认为是一个代码优先的数据库。

这里是实体框架功能工具的链接。它是通过在远程服务器上对数据库进行"逆向工程"来创建模型的。然后,您可以使用EF轻松访问该数据库。

逆向工程代码优先-为现有数据库生成POCO类,派生DbContext和Code First映射

当数据库已经存在时,我所尝试的两个初始化方法都失败了:

Database.SetInitializer<Context>(new Initializer());
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Context>());

但是,可以使用以下命令强制删除数据库:

Database.SetInitializer(new DropCreateDatabaseAlways<Context>());

下面的帖子提供了我的问题的答案:在SQL Server 2008上建立实体框架代码优先数据库

我尝试了两者的组合,并决定最好的解决方案是手动进入SQL管理工作室并删除数据库,并使用初始化器重新创建它,因为这允许我播种数据库的内容。

Database.SetInitializer<Context>(new Initializer());

请参阅此处获取有关播种数据库的更多信息,因为它也是一个相当不稳定的过程!我怎么能让我的数据库种子使用实体框架CodeFirst?