2017-02-04 74 views
0

Generated Properties的實體框架核心文檔使數據註釋看起來像數據註釋可用於生成的代碼,如"timestamp"屬性,如創建/更新爲DateTime類型。實體框架核心數據註釋數據庫生成的值

當試圖使用下面的數據說明與代碼首先遷移沿着:

public class Foo { 
    // some properties 

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

    // more properties 
} 

試圖在命令行執行命令dotnet ef migrations add AddFooTimestamp當我收到以下錯誤:

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

有沒有一種有效的方法來利用模型文檔中描述的數據註釋以及EF核心和SQL Server環境中的代碼優先遷移?或者這只是[Timestamp]註釋,可以在這個時候?

我的項目使用工具Microsoft.EntityFrameworkCore.Tools版本「1.0.0-preview2-final」和Microsoft.EntityFrameworkCore & Microsoft.EntityFrameworkCore.SqlServer版本「1.1.0」。

感謝您提供任何幫助。

+2

嘗試將數據註釋更改爲'[DatabaseGenerated(DatabaseGeneratedOption.Computed)]' – Thennarasan

回答

0

要必須被上INSERT設置DateTime模型的屬性和動作UPDATE我經由Fluent API配置和數據庫觸發器利用的Default Values的組合。我在我的問題中提到的註釋絕對不會自動將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()"); 
} 

數據庫之後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 

釷anks!

相關問題