我正在尝试运行种子方法来创建/更新表中的值(配置值)。初始运行成功,它创建了“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。我可以从代码优先使其可以为空吗?
答案 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类的错误。