2015-01-09 21 views
6

Có thể tự động tăng một thuộc tính không phải là khóa chính trong Khung thực thể không? Những gì tôi có là một lớp trong đó có một ID, mà còn là một số serial:Thuộc tính tăng tự động không phải là khóa

public class Maintenance 
{ 
    [Key] 
    public int ID { get; set; } 
    public int GroupID { get; set; } 
    public int SerialNo { get; set; } 
} 

Tôi có một chỉ mục trên GroupIDSerialNo với một mối quan hệ độc đáo, làm cho nó không thể đối với một nhóm có cùng số serial hai lần .

Điều tôi hiện đang làm là kiểm tra .Max() cho SerialNo trong nhóm đó. Tuy nhiên tôi sẽ thích nó nếu số serial có tự động tăng lên. Điều này có thể không?

Tôi đã tìm kiếm giải pháp, nhưng theo tôi hiểu, không thể có 2 cột tăng tự động với khung thực thể và cột tăng tự động sẽ luôn là cột PK.

Có cách nào để đặt tăng tự động hay không, có giải pháp nào tốt hơn cho vấn đề hơn là sử dụng Max() không? Sử dụng Max() về mặt lý thuyết có thể tạo ra 2 giá trị giống hệt nhau và sẽ gây ra sự cố khi chương trình cố gắng chèn (vì chỉ mục duy nhất).

Tôi đang sử dụng mã trước.

Để làm rõ: Tôi muốn giữ ID làm khóa chính và tính số sê-ri trong khi chèn.

UPDATE:

Tôi đã cố gắng sử dụng [DatabaseGenerated(DatabaseGeneratedOption.Identity)] trên SerialNo mà kết quả trong khuôn khổ tổ chức muốn thay đổi khóa chính vào thuộc tính này. Tôi cũng đã thử [DatabaseGenerated(DatabaseGeneratedOption.Computed)], mà cố gắng để chèn NULL vào cột SerialNo[DatabaseGenerated(DatabaseGeneratedOption.None)] cố gắng chèn 0, về cơ bản làm 'không có gì'.

INFO YÊU CẦU:

Đây là một ví dụ của bảng có thể nhìn như thế nào:

|_ID_|_GroupID_|_SerialNo_| 
| 1 | 1 | 1  | 
| 2 | 1 | 2  | 
| 3 | 2 | 1  | 
| 4 | 1 | 3  | 
| 5 | 2 | 2  | 
+2

Bạn đã tìm thấy một giải pháp cho điều này? Tôi có cùng một câu hỏi/vấn đề ... – Mike

+0

Không, xin lỗi @Mike tôi đã không. Tôi vẫn đang sử dụng '.Max()' –

Trả lời

6

Có, bạn có thể sử dụng following attribute:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int SerialNo { get; set; } 

Xem HERE cho một danh sách chú thích dữ liệu có thể có.

+2

Xin chào, cảm ơn vì liên kết. Nó sẽ rất có ích. Sử dụng 'DatabaseGenerationOption.Identity' sẽ buộc' SerialNo' trở thành khóa chính cho đối tượng, đó không phải là thứ tôi muốn.Tôi muốn giữ ID là khóa chính và tính số sê-ri trong khi chèn. –

+0

@RobinDorbell: 'Tôi muốn giữ ID là khóa chính và tính số sê-ri trong khi chèn.' - điều đó hoàn toàn có ý nghĩa, nhưng không phải là những gì bạn đã yêu cầu ;-). Có lẽ bạn có thể cho chúng tôi một số ví dụ về cách hàng của bạn nên/có thể trông như thế nào? – ChrFin

+1

Đó là 'DatabaseGeneratedOption' và không phải' DatabaseGenerationOption'. –

1

Nếu bạn đang sử dụng máy chủ sql hơn cũng đọc một cách cẩn thận

Can we have more than one identity columns in a table.


Vì vậy, tôi nghĩ rằng bên dưới mã biên dịch nhưng sẽ cung cấp cho bạn một lỗi khi cố gắng để di chuyển/create database.

bạn cũng có thể sử dụng thông thạo api approch như thế này

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Maintenance>().Property(a => a.GroupID 
         ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    modelBuilder.Entity<Maintenance>().Property(a => a.SerialNo 
         ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
} 
Các vấn đề liên quan