我有一个使用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。如果我只从域实体中删除它(并将其保留在表中),也是有效的!
我做错了什么?
答案 0 :(得分:3)
使用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();
......它有效。