2015-11-16 24 views
6

Tôi có một bảng có khóa chính của ID, trường này không phải là cột nhận dạng. Di cư của tôi cho Entity Framework 6 làKhuôn khổ thực thể không nhận dạng - Không thể chèn giá trị NULL vào cột 'ID'

CreateTable(
    "dbo.Action", 
    c => new 
    { 
     ID = c.Int(nullable: false, identity: false), 
     ActionName = c.String(maxLength: 50), 
    }) 
    .PrimaryKey(t => t.ID); 

Điều này có vẻ khá thẳng về phía tôi. Sau đó, tôi có một phương pháp để gieo rắc một số dữ liệu:

public static void Seed(this DbSet<Action> entitySet) 
{ 
    MainContext dbCtx = DataRepositoryBase<Action>.GetContext(entitySet) as MainContext; 
    if (dbCtx != null) 
    { 
      entitySet.Add(new Action() 
      { 
       ID = 1, 
       ActionName = "Test" 
      });     
    } 
} 

Đó là tại thời điểm này tôi nhận được một lỗi

"Không thể chèn các giá trị NULL vào cột 'ID', bảng 'dbo.Action' ; cột không cho phép null INSERT không \ tuyên bố r \ nThe đã chấm dứt"

Như bạn có thể thấy tôi đang cung cấp rõ một giá trị cho cột ID... Tôi đoán rằng Entity Framework được mong đợi ID là một cột nhận dạng

Entity lớp là rất đơn giản

[DataContract] 
public class Action 
{ 
    [DataMember] 
    public int ID { get; set; } 

    [DataMember] 
    public string ActionName { get; set; } 
} 
+0

Bạn có thể gửi các bản đồ cho môi trường 'Action' thực thể? –

+0

Bạn đã nói với EF rằng cột ID không phải là một cột nhận dạng? – DavidG

+0

Chắc chắn đó là những gì tôi đang làm trong quá trình di chuyển khi tôi nói nhận dạng: false – keitn

Trả lời

6

di cư của bạn chỉ tạo bảng trong cơ sở dữ liệu nhưng không nói với Entity Framework các sự Thuộc tính ID không phải là cột IDENTITY. EF chọn thuộc tính gọi là ID nếu bạn không nói với nó mà tài sản để sử dụng làm khóa chính, nhưng bạn cũng cần phải nói với EF rằng nó không phải là một cột IDENTITY, làm điều này bằng cách sử dụng DatabaseGenerated thuộc tính:

[DataContract] 
public class Action 
{ 
    [DataMember] 
    [Key] //This isn't technically needed, but I prefer to be explicit. 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } 

    [DataMember] 
    public string ActionName { get; set; } 
} 
2

Các lỗi là do thực tế rằng tên trường Id được cho là khóa chính và danh tính.
Khi EF tạo câu lệnh chèn không tạo ra giá trị cho trường đó.

Bạn có thể sửa chữa nó bằng cách sử

[DataContract] 
public class Action 
{ 
    [DataMember] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } 

    [DataMember] 
    public string ActionName { get; set; } 
} 
Các vấn đề liên quan