2015-11-03 18 views
8

Thỉnh thoảng khi sử dụng Mã khung thực thể Trước tiên, các quy ước mặc định không tạo loại cơ sở dữ liệu bạn muốn. Ví dụ: theo mặc định, thuộc tính loại System.DateTime tạo cột cơ sở dữ liệu thuộc loại DateTime. Phải làm gì nếu bạn muốn có loại datetime2 (loại DateTime không có vấn đề với múi giờ và giờ tiết kiệm ánh sáng ban ngày)?Mã khung thực thể đầu tiên: thuộc tính DataType nào cho DateTime2?

Có thể chỉ định loại cơ sở dữ liệu bắt buộc với Chú thích dữ liệu bằng cách sử dụng DataTypeAtrribute. Một trong các nhà xây dựng của DataTypeAttribute chấp nhận thông số DataType Enumeration. Vì vậy, người ta có thể chỉ định một cái gì đó như:

[DataType(DataType.DateTime)] 
public DateTime DateOfBirth {get; set;} 

Loại DataType liệt kê chứa rất nhiều loại, tuy nhiên nó thiếu giá trị cho DateTime2.

Một cách tiếp cận khác sẽ sử dụng API thông thạo. Tạo một DateTime2 trong phương pháp DBContext.OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Student>().Property(p => p.BirthDate) 
     .HasColumnType("datetime2"); 
} 

Các DataTypeAttribute có second constructor that accepts a string. Chuỗi này được định nghĩa là

Tên của mẫu trường tùy chỉnh để liên kết với trường dữ liệu.

Vì vậy, người ta sẽ cho rằng những điều sau đây sẽ là đủ để tạo ra một datetime2:

[DataType("datetime2")] 
public DateTime DateOfBirth {get; set;} 

Alas, điều này không làm việc. Cột được tạo vẫn có định dạng DateTime.

Câu hỏi: chuỗi nào để sử dụng trong hàm tạo để tạo datetime2?

Trả lời

18

The DataType attribute is not used for column type mapping for Code First:

Các Cột chú thích là một chuyên nghiệp hơn trong cách xác định các thuộc tính của một cột ánh xạ. Bạn có thể quy định tên, kiểu dữ liệu hoặc thậm chí thứ tự mà cột xuất hiện trong bảng. [...] Đừng nhầm lẫn thuộc tính TypeName của Cột với DataAnnotation DataType. DataType là chú thích được sử dụng cho giao diện người dùng và bị bỏ qua bằng mã đầu tiên.

Vì vậy:

[Column(TypeName="datetime2")] 
4

Đối với những người vẫn còn quan tâm đến việc làm thế nào để xác định các loại cột cho tài sản. Trong DbContext.OnModelCreating bạn có thể xác định rằng mọi giá trị của một số loại phải có một số loại cơ sở dữ liệu.

Nếu bạn làm điều này, bạn không phải viết các thuộc tính cũng như API thông thạo cho mỗi DateTime. Nó dễ dàng hơn để nhất quán và để cho tất cả DateTime có cùng một kiểu cột. Tương tự, bạn có thể cung cấp cho tất cả các số thập phân có cùng độ chính xác, ngay cả khi số thập phân được thêm vào trong tương lai.

Giả sử bạn muốn xác định rằng mọi System.DateTime phải có loại cột DateTime2; mọi System.Decimal phải có loại cột có độ chính xác được chỉ định.Trong DbContext bạn sẽ viết:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // every property of type DateTime should have a column type of "datetime2": 
    modelBuilder.Property<DateTime>() 
     .Configure(property => property.HasColumnType("datetime2"); 
    // every property of type decimal should have a precision of 19 
    // and a scale of 8: 
    modelBuilder.Property<decimal>() 
     .Configure(property => property.HasPrecision(19, 8); 
} 
Các vấn đề liên quan