2014-11-20 17 views
7

Tôi đang cố gắng sử dụng Code-First EF6 với các giá trị SQL mặc định.Giá trị mặc định của cột SQL với Entity Framework

Ví dụ tôi cột "CreatedDate"/hữu không null với default trong SQL "getdate()"

Làm Tôi biểu này trong mã Mẫu tôi? Hiện nay tôi có:

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

Sẽ làm việc này, hoặc tôi sẽ cần phải sử dụng một nullable mặc dù cột thực tế nên không null, do EF không gửi một giá trị khi nó chưa được thiết lập:

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

Hoặc có giải pháp nào tốt hơn không?

Tôi không muốn EF xử lý các giá trị mặc định của mình - Tôi biết điều này có sẵn cho tôi nhưng không thể thực hiện được trong tình huống hiện tại của tôi.

Trả lời

12

Hiện tại trong EF6 không có thuộc tính xác định hàm cơ sở dữ liệu được sử dụng cho một giá trị mặc định của thuộc tính nhất định. Bạn có thể bỏ phiếu trên CodePlex để có được nó thực hiện:

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

Cách chấp nhận để thực hiện một cái gì đó như thế là sử dụng Computed tính với Migrations nơi bạn chỉ định các chức năng cơ sở dữ liệu mặc định.

lớp bạn có thể trông như thế này trong C#:

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

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

Thuộc tính tính không phải là nullable.

Sau đó, bạn phải chạy di chuyển và sửa đổi nó bằng tay để bao gồm hàm SQL mặc định. Di chuyển có thể trông giống như:

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

    } 

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

Bạn sẽ thấy hàm defaultValueSql. Đó là chìa khóa để tính toán hoạt động

+0

Tuyệt vời, cảm ơn, tôi sẽ thực hiện việc này ngay bây giờ. – Carl

+0

Bạn được chào đón;) –

2

Câu trả lời được chấp nhận là chính xác, chỉ cần cập nhật với giải pháp EF Core; (còn giải pháp của tôi tập trung vào việc thay đổi giá trị mặc định, thay vì tạo đúng giá trị lần đầu tiên)

Vẫn không có thuộc tính Dữ liệu.

Và bạn vẫn phải sử dụng API thông thạo; nó có một HasDefaultValue

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Blog>() 
     .Property(b => b.Rating) 
     .HasDefaultValue(3); 
} 

Lưu ý, cũng có HasDefaultValueSql là đối với trường hợp NULL:

 .HasDefaultValueSql("NULL"); 

Và bạn cũng có thể sử dụng Migrations UpDown phương pháp, bạn có thể thay đổi defaultValue hoặc defaultValueSql nhưng bạn có thể cần phải giảm chỉ mục trước. Dưới đây là ví dụ:

public partial class RemovingDefaultToZeroPlantIdManualChange : Migration 
{ 
    protected override void Up(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.DropIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME" 
     ); 

     migrationBuilder.AlterColumn<int>(
      name: "COLUMN_NAME", 
      table: "TABLE_NAME", 
      nullable: true, 
      //note here, in the Up method, I'm specifying a new defaultValue: 
      defaultValueSql: "NULL", 
      oldClrType: typeof(int)); 

     migrationBuilder.CreateIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME", 
      column: "COLUMN_NAME" 
     ); 
    } 

    protected override void Down(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.DropIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME" 
     ); 

     migrationBuilder.AlterColumn<int>(
      name: "COLUMN_NAME", 
      table: "TABLE_NAME", 
      nullable: true, 
      //note here, in the Down method, I'll restore to the old defaultValue: 
      defaultValueSql: "0", 
      oldClrType: typeof(int)); 

     migrationBuilder.CreateIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME", 
      column: "COLUMN_NAME" 
     ); 


    } 
} 
Các vấn đề liên quan