我正在使用 Entity Framework 使用 Code First 模型生成的数据库。我已经更改了几次模型,并且熟悉了包管理器控制台,它会根据模型的更改生成代码来修改数据库。
到目前为止它运行良好,直到我添加了几个字段来执行乐观并发控制。这些是我添加到模型中的字段:
public int Rowversion { get; set; }
public DateTime MLTimestamp { get; set; }
第二个字段名为“MLTimestamp”,但最初名为 Timestamp。我更改了它以尝试修复尝试更新数据库时收到的错误。
因此,这是包管理器生成的代码:
public partial class MediaTypeRowversion : DbMigration
{
public override void Up()
{
AddColumn("MediaTypes", "Rowversion", c => c.Int(nullable: false));
AddColumn("MediaTypes", "MLTimestamp", c => c.DateTime(nullable: false));
}
public override void Down()
{
DropColumn("MediaTypes", "MLTimestamp");
DropColumn("MediaTypes", "Rowversion");
}
}
当我Update-Database
从包管理器控制台运行时,我收到以下错误消息:
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
我不确定它认为我正在尝试进行什么转换。这是以前数据库中不存在的字段。没有什么可以“转换”的。上面说了,第二个字段本来就是Timestamp,所以我拍了拍额头说,啊,数据库里肯定已经有那个名字的字段了。因此,我在模型和迁移代码中对其进行了更改,但仍然出现此错误。
这些字段都没有数据注释为Timestamp
. 考虑到使用 EF 已经令人沮丧,我认为只实现我自己的 rowversion 并发检查会更容易,而且它在 Session-State 模型上就像一个魅力。
我尝试简单地删除我的 .mdf 文件并添加另一个具有相同名称的文件,以便它可能会从头开始重新构建表,但是哦不,这显然不是那么简单地解决。我对仅将时间戳存储为字符串的想法持开放态度,因为 EF 在尝试在 C# DateType 值和 SQL Server 日期时间值之间来回切换时似乎消化不良,但我宁愿尝试将其保留为如果可能,日期时间。
无论如何,如果有人可以提供一些关于我如何克服这个问题的指示,我将非常感激!