Generated Properties的实体框架核心文档使得数据注释看起来像生成的代码首先"timestamp"属性,例如以DateTime
类型创建/更新。
尝试使用以下数据注释以及代码优先迁移时:
public class Foo {
// some properties
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Created { get; set; }
// more properties
}
尝试在命令行中执行命令dotnet ef migrations add AddFooTimestamp
时收到以下错误:
身份值生成不能用于属性“已创建”#39;上 实体类型' Foo'因为属性类型是' DateTime'。身分 值生成只能与有符号整数属性一起使用。
是否有一种有效的方法可以利用模型文档中描述的数据注释以及EF Core和SQL Server环境中的代码优先迁移?或者它只是[Timestamp]
注释,此时可用吗?
我的项目正在使用工具Microsoft.EntityFrameworkCore.Tools
版本" 1.0.0-preview2-final"和Microsoft.EntityFrameworkCore
& Microsoft.EntityFrameworkCore.SqlServer
个版本" 1.1.0"。
感谢您提供任何帮助。
答案 0 :(得分:0)
要使用DateTime
和INSERT
操作设置的UPDATE
模型属性,我使用了Default Values通过Fluent API
配置和数据库触发器的组合。我在问题中提到的注释绝对不会自动配置SQL Server以生成默认值或更新的DateTime
值。
<强>型号:强>
public class Foo {
// some properties
public DateTime Created { get; set; }
public DateTime LastUpdated { get; set; }
// more properties
}
默认值:
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<Foo>()
.Property(i => i.Created)
.HasDefaultValueSql("getdate()");
modelBuilder.Entity<Foo>()
.Property(i => i.LastUpdated)
.HasDefaultValueSql("getdate()");
}
数据库更新后触发:
CREATE TRIGGER [dbo].[Foo_UPDATE] ON [dbo].[Foo]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN;
DECLARE @Id INT
SELECT @Id = INSERTED.Id
FROM INSERTED
UPDATE dbo.Foo
SET LastUpdated = GETDATE()
WHERE Id = @Id
END
谢谢!