Dot-Net

實體框架的 SQL 列預設值

  • November 20, 2014

我正在嘗試將 Code-First EF6 與預設 SQL 值一起使用。

例如,我有一個“CreatedDate”列/屬性不為空,SQL 中的預設值為“getdate()”

我如何在我的程式碼模型中表示這一點?目前我有:

<DatabaseGenerated(DatabaseGeneratedOption.Computed)>
Public Property CreatedDate As DateTime

這是否可行,或者即使實際列不應該為空,我是否需要使用可為空,因此 EF 在未設置時不會發送值:

<DatabaseGenerated(DatabaseGeneratedOption.Computed)>
Public Property CreatedDate As DateTime?

或者那裡有更好的解決方案?

我不希望 EF 處理我的預設值 - 我知道這對我來說是可用的,但在我目前的情況下是不可能的。

目前在 EF6 中沒有一個屬性來定義用於某個屬性預設值的數據庫函式。您可以對 Codeplex 進行投票以實現它:

<https://entityframework.codeplex.com/workitem/44>

實現類似功能的公認方法是在您指定預設數據庫函式的位置使用Computed屬性。Migrations

您的類在 C# 中可能如下所示:

public class MyEntity
{
   [Key]
   public int Id { get; set; }
   public string Name { get; set; }

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

計算的屬性不必是可為空的。

然後您必須執行遷移並手動修改它以包含預設 SQL 函式。遷移可能如下所示:

public partial class Initial : DbMigration
{
   public override void Up()
   {
       CreateTable(
           "dbo.MyEntities",
           c =&gt; new
               {
                   Id = c.Int(nullable: false, identity: true),
                   Name = c.String(),
                   Created = c.DateTime(nullable: false, defaultValueSql: "GetDate()"),
               })
           .PrimaryKey(t =&gt; t.Id);

   }

   public override void Down()
   {
       DropTable("dbo.MyEntities");
   }
}

您會注意到 defaultValueSql 函式。這是讓計算工作的關鍵

引用自:https://stackoverflow.com/questions/27038524