我的应用程序首先在Sql CE数据库上使用Entity Framework 5.0代码。到目前为止,我们已使用自动迁移来管理实体映射更改。但是,我现在有一个更改,我需要创建一个自定义迁移,以确保在更新期间没有数据丢失。我对实体进行了更改,并使用Add-Migration命令为我生成了Up()和Down()方法。我定制了Up()方法来插入我的自定义sql来保存数据,并测试了我的应用程序。
当我运行应用程序时,收到错误:
无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。
好的,我不明白这一点,因为所有的更改都在Up()方法中详细说明了。 所以我重新开启自动迁移只是为了看看会发生什么。现在我收到了这个错误:
“无法更改NTEXT或IMAGE类型的列[列名称= LastName]”
此错误来自尚未触及我的更改的表/实体。现有数据库将此字符串映射到 nvarchar(4000 )。如果在收到此异常后检查数据库,我会发现列已更改为 ntext 。 EF做什么?为什么它会触及尚未更改的表格?如何获得有关此处发生的事情的更多信息?
更新 作为一种解决方法,我尝试使用数据注释标记我的实体中的每个字符串类型:
[Column(TypeName = "ntext")]
public virtual string LastName
{
get;
set;
}
现在我的所有字符串都在数据库中使用ntext。执行查询时会导致进一步的异常:
ntext和image数据类型不能在WHERE,HAVING,GROUP BY,ON或IN子句中使用,除非这些数据类型与LIKE或IS NULL谓词一起使用。
所以,总结一下:
答案 0 :(得分:0)
对我来说,修改了Up
方法。
SerialNumber = c.String(maxLength: 99)
代替了
SerialNumber = c.String()
答案 1 :(得分:0)
我有同样的问题,我通过打开SQl Server Compact / SQlite Toolbox资源管理器窗口手动编辑表列数据类型来修复,然后花费数据库名称,然后花费您要编辑的表并右键单击列你想编辑,然后点击删除脚本,然后运行脚本,列将从表中删除,然后右键单击表并单击添加列,从这里你可以选择你想要的数据类型并添加新列办法。我希望这对某人有所帮助。