实体框架核心数据注释数据库生成的值

时间:2017-02-04 03:55:34

标签: c# sql-server data-annotations entity-framework-core

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"。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

要使用DateTimeINSERT操作设置的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

谢谢!