實體框架核心數據註釋數據庫生成的值

c# data-annotations entity-framework-core sql-server

生成屬性的實體框架核心文檔使得看起來數據註釋可以用於生成代碼,首先是“時間戳”屬性,例如作為DateTime類型創建/更新。

嘗試使用以下數據註釋以及代碼優先遷移時:

public class Foo {
    // some properties

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Created { get; set; }

    // more properties
}

嘗試執行命令dotnet ef migrations add AddFooTimestamp時收到以下錯誤dotnet ef migrations add AddFooTimestamp在命令行中dotnet ef migrations add AddFooTimestamp

身份值生成不能用於實體類型'Foo'上的'Created'屬性,因為屬性類型是'DateTime'。標識值生成只能與有符號整數屬性一起使用。

是否有一種有效的方法來利用模型中文檔中描述的數據註釋以及EF Core和SQL Server環境中的代碼優先遷移?或者它只是[Timestamp]註釋,此時可用嗎?

我的項目是使用工具Microsoft.EntityFrameworkCore.Tools版本“1.0.0-preview2-final”和Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServer版本“1.1.0”。

感謝您提供任何幫助。

一般承認的答案

要獲得在INSERTUPDATE操作上設置的DateTime模型屬性,我通過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()");
}

數據庫AFTER UPDATE觸發器:

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

謝謝!



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow