Code first Error方法出错 - 无法更新时间戳列

时间:2016-03-02 00:11:53

标签: sql-server asp.net-mvc ef-code-first

我正在尝试运行种子方法来创建/更新表中的值(配置值)。初始运行成功,它创建了“TestSeed”记录。但是更新会引发以下错误。

这是我的种子方法,

 context.SystemValues.AddOrUpdate(
            sv => sv.Name,
            new SystemValue { Name = "TESTSEED", Description = "Seed test1.",    CreatedBy = "Sys", CreatedOn = DateTime.UtcNow, Value = "TESTSEED", ModifiedBy = "Sys", ModifiedOn = DateTime.UtcNow }
            );
        context.SaveChanges();

AutomaticMigrationsEnabled = false

系统值类,

public partial class SystemValue
{
    public int SystemValueId { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public string Description { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public System.DateTime ModifiedOn { get; set; }
    public string ModifiedBy { get; set; }
    public byte[] Version { get; set; }
}

Update-Database中的错误,

  

PM>更新数据库   指定'-Verbose'标志以查看应用于目标数据库的SQL语句。   没有待定的显式迁移。   运行种子方法。   System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常---> System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常---> System.Data.SqlClient.SqlException:无法更新时间戳列。      在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)      在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)      在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)

为什么此更新无效?我错过了什么吗?

修改

我注意到的一件事是RowVersion字段不是Nullable。我可以从代码优先使其可以为空吗?

2 个答案:

答案 0 :(得分:2)

您需要告诉EF这是 <input type="checkbox" name= "checkBox{{$index}}" id="" data-ng-model= "person.check" ng-value="true" ng-click="myService.updateList(patient.code)" > / timestamp列,以便它不会尝试更新它。您可以通过在该列上添加rowversion属性来执行此操作:

[Timestamp]

SQL Server中的public partial class SystemValue { public int SystemValueId { get; set; } public string Name { get; set; } public string Value { get; set; } public string Description { get; set; } public System.DateTime CreatedOn { get; set; } public string CreatedBy { get; set; } public System.DateTime ModifiedOn { get; set; } public string ModifiedBy { get; set; } [Timestamp] public byte[] Version { get; set; } } / TIMESTAMP列是一个特殊列,只有SQL Server内部可以更新 - 您作为数据库程序员只能读取它。它会跟踪行的版本,例如:当你读一行时,你可以记下它的版本,当你再次写它时,你可以查看该行是否已被修改,因为你已经读过它(然后该行版本列会有与你所读的不同的价值

答案 1 :(得分:0)

Marc_S是正确的。但是,在应用此更改时,您需要考虑一些小问题。如果将“TimeStamp”属性添加到现有的Version字段,并且当我运行update-database时,它会给出另一个错误 - “无法更新”版本数据类型我必须首先删除现有版本。因此,您需要先删除它。

步骤1 - 删除现有版本字段,添加新迁移并执行更新数据库。

步骤2 - 使用“TimeStamp”添加版本字段并执行迁移和更新数据库。

如果您要将EF数据库优先转换为EF代码优先,我提到的问题就会发生。我最初在迁移过程中错过了在迁移过程中测试此System Values类的错误。