0

我正在关注实体框架教程: 链接

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

<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 新手,对 Code First 迁移了解不多。您是否遇到过上述错误,代码迁移会解决这个问题吗?如果是,为什么?

4

3 回答 3

0

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

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

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

  1. 初始化您的数据库,以便它承认 EF 代码优先的东西
  2. 更新数据库,将所有迁移前滚到迄今为止

我在这里找到了一些关于如何做到这一点的很好的报道。该博客还对一般的 EF 主题进行了一些很好的报道

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

于 2013-03-21T23:09:49.330 回答
0

是 Entity Framework Power Tools 的链接。它用于通过“逆向工程”远程服务器上的数据库来创建模型。然后,您可以使用 EF 轻松访问此数据库。

逆向工程师 Code First - 为现有数据库生成 POCO 类、派生的 DbContext 和 Code First 映射

于 2013-03-22T08:59:13.747 回答
0

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

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

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

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

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

我尝试了两者的结合,并决定最好的解决方案是手动进入 SQL Management Studio 并 DROP 数据库,并使用初始化程序重新创建它,因为这允许我播种数据库的内容。

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

有关播种数据库的更多信息,请参见此处,因为它也是一个非常不稳定的过程! 如何使用 Entity Framework CodeFirst 让我的数据库播种?

于 2013-03-24T19:50:48.977 回答