2015-10-07 13 views
17

Tôi mới tham gia EF và cố gắng thực hiện các bước đầu tiên bằng cách tiếp cận mã đầu tiên trong ETF6.0 và bây giờ tôi gặp sự cố.Cách sử dụng thuộc tính String làm khóa chính trong Entity Framework

tôi có một tài sản

[Key] 
public string FooId { get; set; } 

đó là chìa khóa chính của tôi cho mô hình.

Nhưng nếu tôi chạy lệnh

PM> Update-Database

trong quản lý gói giao diện điều khiển để cập nhật cấp phát di cư đến các cơ sở dữ liệu tôi nhận được lỗi sau:

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

Nếu tôi thay đổi PK trong mô hình của tôi để

[Key] 
public int FooId { get; set; } 

mọi thứ hoạt động tốt.

Nhưng tôi sẽ cần PK là loại chuỗi vì nó làm cho cảm giác hoàn toàn trong trường hợp của tôi. Tôi biết có những nhược điểm nhưng đối với tôi nó là cần thiết.

Tôi thấy một bài đăng cũ hơn ở đây How to make string as primary key in entity framework!.

Nhưng có vẻ như không giải quyết được vấn đề của tôi hoặc tôi chỉ không hiểu nó.

Có thực sự là tôi không thể sử dụng chuỗi như PK trên cơ sở dữ liệu SQL không?

Hoặc có cách nào để làm điều đó không?

+0

Điều quan trọng là mặc định để nhận dạng, vì vậy bạn cần phải tắt nó bằng thuộc tính '[DatabaseGenerated (DatabaseGeneratedOption.None)] 'Điều đó có nghĩa là bạn cần chỉ định khóa bằng tay khi thêm (nó không được tạo). – Hopeless

Trả lời

29

Đây là cách thích hợp của việc tạo ra một PK mà không nhận dạng autoincrement được kích hoạt:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public string FooId { get; set; } 
2

Nếu bạn cần khóa chính của mình thành chuỗi, thì đừng đặt cột đó làm cột nhận dạng. Các cột nhận dạng sẽ tạo ra các giá trị khóa chính cho bạn, mà bạn nên tắt nếu bạn có ý định tự tạo các giá trị.

1

Lý do bạn có chuỗi là khóa chính là gì?

Tôi chỉ cần đặt khóa chính thành trường số nguyên tăng dần tự động và đặt chỉ mục trên trường chuỗi.

Bằng cách đó, nếu bạn thực hiện tìm kiếm trên bàn, chúng sẽ tương đối nhanh và tất cả các kết nối của bạn và các giao diện bình thường sẽ không bị ảnh hưởng về tốc độ của chúng.

Bạn cũng có thể kiểm soát số lượng trường chuỗi được lập chỉ mục. Nói cách khác, bạn có thể nói "chỉ lập chỉ mục 5 ký tự đầu tiên" nếu bạn nghĩ điều đó là đủ. Hoặc nếu dữ liệu của bạn có thể tương đối giống nhau, bạn có thể lập chỉ mục toàn bộ trường.

+0

Tôi giả định rằng lý luận của ông giống như tôi: bạn có thể sử dụng đối tượng ngữ cảnh .Find (fooId) od và áp dụng bộ nhớ đệm mức đầu tiên của khung thực thể Tôi sử dụng nó cho tên người dùng –

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