3

我的应用程序在 Sql CE 数据库之上使用 Entity Framework 5.0 代码优先。到目前为止,我们一直使用自动迁移来管理实体映射更改。但是,我现在有一个更改,我需要为此创建一个自定义迁移,以确保在更新期间不会丢失任何数据。我对实体进行了更改,并使用了为我生成 Up() 和 Down() 方法的 Add-Migration 命令。我自定义了 Up() 方法来插入我的自定义 sql 来保存数据,并测试了我的应用程序。

当我运行应用程序时,我收到了错误:

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

好的,我不明白这一点,因为我的所有更改都在执行的 Up() 方法中详细说明。所以我重新打开自动迁移只是为了看看会发生什么。现在我收到此错误:

“无法更改 NTEXT 或 IMAGE [列名 = 姓氏] 类型的列”

此错误来自我的更改甚至没有触及的表/实体。现有数据库将此字符串映射到nvarchar(4000 )。如果在收到此异常后检查数据库,我观察到列已更改为ntext。英孚在做什么?为什么它会触及尚未更改的表?我怎样才能获得更多关于这里发生的事情的信息?

更新: 作为一种解决方法,我尝试使用数据注释标记实体中的每个字符串类型,如下所示:

[Column(TypeName = "ntext")]
public virtual string LastName
{
    get;
    set;
}

现在我所有的字符串都在数据库中使用 ntext 。这会在执行查询时导致进一步的异常:

ntext 和 image 数据类型不能用于 WHERE、HAVING、GROUP BY、ON 或 IN 子句,除非这些数据类型与 LIKE 或 IS NULL 谓词一起使用。

所以,总结一下:

  1. 关闭自动迁移会导致 EF 检测幻像更改并引发异常
  2. 结合自定义迁移打开自动迁移会导致所有现有字符串映射到 ntext
  3. 无法查询映射到 ntext 的字符串,从而有效地使它们在我的应用程序中无用
4

2 回答 2

0

对我来说,对一种Up方法进行了修改。

SerialNumber = c.String(maxLength: 99)

被应用而不是

SerialNumber = c.String()
于 2015-07-23T07:25:02.000 回答
0

我有同样的问题,我通过打开 SQl Server Compact/SQlite Toolbox 资源管理器窗口手动编辑表列数据类型来修复,然后展开数据库名称,然后展开要编辑的表并右键单击要编辑的列编辑,然后单击删除脚本,然后运行脚本,该列将从表中删除,然后右键单击表并单击添加列,然后您可以从这里选择所需的数据类型并以这种方式添加新列。我希望这可以帮助别人。

于 2016-07-01T21:10:30.183 回答