不推荐使用的功能' INSERT NULL进入TIMESTAMP列'此版本的SQL Server不支持

时间:2014-02-24 13:59:21

标签: c# sql entity-framework azure azure-sql-database

我有一个使用Entity Framework Code First的Web API。患者域实体看起来像:

public class Patient
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    ...
    public byte[] Version { get; private set; }                
}

患者表就像:

CREATE TABLE [dbo].[Patient]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [FirstName] NVARCHAR(100) NOT NULL,
    [LastName] NVARCHAR(100) NOT NULL,
    ...
    [Version] ROWVERSION NOT NULL,      
)

如果我在本地运行,患者条目会成功添加到数据库中,因此它可以正常工作(SQL Server 2008 R2)。

但是,如果我部署到Azure并在那里运行它,我会得到例外:

  

更新条目时发生错误。有关详细信息,请参阅内部异常此版本的SQL Server不支持不推荐使用的功能'INSERT NULL into TIMESTAMP columns'。

如果从表中删除Version列;和域实体的Version属性,它也适用于Azure。如果我只从域实体中删除它(并将其保留在表中),也是有效的!

我做错了什么?

3 个答案:

答案 0 :(得分:3)

使用timestamp属性装饰你的代码第一个版本属性,一切都会很好。

http://msdn.microsoft.com/en-us/data/jj591583#TimeStamp

答案 1 :(得分:1)

这是因为您的架构中有一些可以为空的TIMESTAMP列。 它在您的本地SQL Server 2008上运行不正常但SQL 2012运行失败,并且很可能Azure默认运行最新的SQL版本。

参见此参考: Deprecated features in SQL 2012

您可以尝试设置兼容级别 Setting compatibility level for SQL 2012

答案 2 :(得分:1)

似乎Code First需要知道Version列是并发令牌。如果我添加:

 modelBuilder.Entity<Patient>().ToTable("Patient").Property(p => p.Version).IsRowVersion().IsConcurrencyToken();

......它有效。