2012-08-30 42 views
7

Tôi đang sử dụng mã Khung thực thể đầu tiên. Tôi có một bảng sẽ không vượt quá 100 hàng và tôi muốn sử dụng datatype byte (tinyint trong SQL Server) làm khóa chính.Sử dụng byte làm kiểu dữ liệu khóa chính

Đây là những gì tôi có cho đến nay:

[Key] 
public byte Id { get; set; } 

Vấn đề là khi Entity Framework tạo ra cơ sở dữ liệu, nó không được thiết lập bản sắc bất động sản đặc điểm kỹ thuật cho phép các hàng để tự động tăng trên chèn.

Nếu tôi thay đổi kiểu dữ liệu thành Int16 (smallint trong SQL Server), mọi thứ hoạt động hoàn hảo.

Có cách nào để nói cho Khung thực thể đặt thuộc tính tăng tự động hoặc có thể sử dụng byte làm khóa chính với mã khung Entity đầu tiên không?

+5

Tại sao bạn hạn chế cơ sở dữ liệu của mình như thế này? Nếu nó chỉ có vài hàng, không gian thêm sẽ không bị tổn thương. – delnan

+2

@delnan, vâng phải, tại sao không làm cho nó một varchar (100) ** ';-)' **. Bạn nên luôn chọn đúng loại dữ liệu hạn chế nhất có sẵn, đặc biệt là đối với PK. Nếu bạn sử dụng PK này như một FK trong một bảng với 50 triệu hàng và thêm một chỉ mục vào nó, sẽ có một sự khác biệt. Kích thước cột ảnh hưởng nhiều hơn không gian đĩa, chỉ cần nghĩ về bộ nhớ cache và bạn lãng phí bao nhiêu cho một lỗi lựa chọn kiểu dữ liệu tầm thường. Ngoài ra, nếu ứng dụng của bạn freaks ra và cố gắng để chèn một giá trị ra hoặc phạm vi, nó sẽ thất bại. –

Trả lời

13

Loại byte được hỗ trợ làm khóa và làm cột nhận dạng. Đây không phải là mặc định để đánh dấu byte khóa chính làm nhận dạng. Nhưng bạn có thể ghi đè mặc định này:

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public byte Id { get; set; } 

Đặt tùy chọn này Identity một cách rõ ràng là không cần thiết cho một int, một longshort (? Và có lẽ nhiều loại), nhưng nó là một byte (= tinyint trong SQL Máy chủ). Tôi đã tìm ra bằng cách thử nghiệm nhưng không thể tìm thấy nó chính thức được ghi lại ở bất cứ đâu.

+0

Hoàn hảo! Chính xác những gì tôi đang tìm kiếm! Cảm ơn bạn! – user962926

+0

Đối với thuộc tính 'short' không phải là khóa chính xác định, tôi phải sử dụng thuộc tính này với giá trị' DatabaseGeneratedOption.None'. Cảm ơn! – STW

+0

Đơn giản chỉ cần tacking vào một thuộc tính mới với một Add-Migration bổ sung đã không làm việc cho tôi. IDENTITY (1,1) không thêm. Tôi đã phải xóa di chuyển của tôi và bảng trước khi nó cuối cùng được thêm vào. Tôi đang sử dụng EF 6.1.3. –

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