2012-05-03 24 views
33

Tôi biết đây không phải là giải pháp lý tưởng nhất, nhưng tôi cần phải thêm trường tăng tự động vào một trong các đối tượng đầu tiên của Mã EF của tôi. Id cột này KHÔNG phải là Id, là một guid.Trường tăng tự động Khuôn khổ thực thể, không phải là Mã số

Có cách nào để tôi xác định trường tăng tự động trong mã hoặc tự tạo cột và xác định trong DB rằng công việc tăng tự động của cột đó?

Trả lời

51

Bạn có thể chú thích thuộc tính đó với DatabaseGenerated(DatabaseGeneratedOption.Identity). EF chỉ cho phép một cột nhận dạng duy nhất trên mỗi bảng.

public class Foo 
{ 
    [Key] 
    public Guid Id { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Bar { get; set; } 
} 
+1

Tôi đã nhìn thấy DatabaseGeneratedOption.Identity nhưng tbh tôi đã lười biếng và không đọc nó, tôi chỉ giả định rằng nó làm cho cột đó là trường PKey. Cảm ơn, tôi sẽ cho nó đi. – JamesStuddart

+0

Điều này sẽ vẫn hoạt động với Cơ sở dữ liệu đa nhiệm không? – amd

+0

@Ahmad Nó sẽ không hoạt động nếu mỗi người thuê có hạt giống riêng của mình – Eranga

6

Bài đăng cũ nghĩ tôi sẽ chia sẻ những gì tôi đã tìm thấy với Khung thực thể 6.1.3.

Tôi đã tạo một thư viện lớp dữ liệu đơn giản bằng C# và .NET Framework 4.6.1, thêm một kho lưu trữ/lớp dịch vụ đơn giản, một lớp ngữ cảnh đầu tiên mã và chỉ tệp web.config của tôi vào cơ sở dữ liệu SQL Express cục bộ 2014.

Trong lớp thực thể tôi đã thêm các nhà xây dựng thuộc tính sau cho cột Id:

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

Sau đó, tôi tạo ra một sự chuyển đổi mới bằng cách gõ như sau trong Visual Studio 2015 Package Manager:

Add-Migration

Đặt tên cho di chuyển rồi đợi lớp DbMigtation được tạo. Sửa lại lớp và thêm các hoạt động CreateTable sau:

CreateTable(
"dbo.Article", 
    c => new 
    { 
     Id = c.Guid(nullable: false, identity: true), 
     Title = c.String(), 
     Content = c.String(), 
     PublishedDate = c.DateTime(nullable: false), 
     Author = c.String(), 
     CreateDate = c.DateTime(nullable: false), 
    }) 
    .PrimaryKey(t => t.Id); 
} 

Bảng trên là một ví dụ vấn đề mấu chốt ở đây là chú thích xây dựng sau đây:

nullable: false, identity: true 

này cho EF specifiy cột như không nullabe và bạn muốn đặt nó như là một cột nhận dạng được hạt giống của EF.

Chạy di cư một lần nữa với lệnh sau:

update-database 

này sẽ chạy lớp di dân thả bảng đầu tiên (phương pháp Xuống()) thì việc tạo một bảng (Up() phương pháp).

Chạy thử nghiệm đơn vị và/hoặc kết nối với cơ sở dữ liệu và chạy truy vấn chọn bạn sẽ thấy bảng của bạn ở dạng mới, thêm một số dữ liệu ngoại trừ cột Id và bạn sẽ thấy hướng dẫn mới (hoặc bất kỳ loại dữ liệu nào bạn chọn) được tạo ra.

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