2011-10-22 48 views
28

Đây là mã của tôi, rất đơn giản ...Mã đầu tiên - Không thể chèn các giá trị NULL vào cột 'Id'

var newUser = new User(); 
     newUser.Id=id; 
     newUser.Email = email; 
     this.DataContext.Set<User>().Add(newUser); 
     this.DataContext.SaveChanges(); 

Các lỗi tôi nhận được là một SQLException tại this.DataContext.SaveChanges(); nói rằng:

Không thể chèn giá trị NULL vào cột 'Id', bảng 'xxxxx.dbo.Users'; cột không cho phép null. INSERT không thành công.

tôi đã sửa lỗi và phát hiện ra rằng có giá trị trong Id & Email trong newuser tại this.DataContext.Set<User>().Add(newUser);

Nếu đây là trường hợp, như thế nào là giá trị trở thành null?

Các lỗi stack trace:

[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.] 
    System.Data.Entity.Internal.InternalContext.SaveChanges() +204 
    System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +23 
    System.Data.Entity.DbContext.SaveChanges() +20 

tôi đã không thể hiểu hoặc giải quyết này ....

có chân thành đánh giá cao bất kỳ giúp đỡ trong việc này ...

Trân Arnab

Giải pháp

Ok, cảm ơn Ladislav đã chỉ cho tôi đúng hướng: Thêm thuộc tính [DatabaseGenerated(DatabaseGeneratedOption.None)] giải quyết được sự cố.

+0

Loại id là gì? Có thể nó là một cái gì đó là đi sai với việc tạo ra chìa khóa trong cơ sở dữ liệu? –

+0

loại là bigint trong sqlserver, trong lớp người dùng nó là dài .. Ngoài ra khi tôi sử dụng khung thực thể bình thường mà không có codefirst, nó hoạt động – Arnab

+0

tham số id cũng dài – Arnab

Trả lời

7

Tôi đã gặp sự cố tương tự, đã tìm thấy câu hỏi của bạn và sau đó nhận thấy câu hỏi Entity Framework 4.1 code-first KeyAttribute as non-identity column này (có thuộc tính đã giải quyết được sự cố của tôi).

Nếu bạn xác định người dùng như:

public class User 
{ 
    [DataMember, Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long ID { get; set; } 

    [DataMember] 
    public string Email { get; set; } 
} 

Mấu chốt ở đây là đặt các thuộc tính:

  • chính
  • DatabaseGenerated

vào cột ID. Rõ ràng vấn đề chúng ta đang chiến đấu là Entity Framework theo mặc định sẽ làm chèn với các khóa là danh tính.

+0

Điều này đã giúp tôi cảm ơn! –

21

Đề cập đến this post có vẻ như khung thực thể dự kiến ​​theo mặc định mà bạn chèn vào cột nhận dạng.

Để giải quyết vấn thử này:

modelBuilder.Entity<BOB>() 
    .HasKey(p => p.Id) 
    .Property(p => p.Id) 
    .StoreGeneratedPattern = StoreGeneratedPattern.None; 

builder.Entity<BOB>().MapSingleType().ToTable("BOB"); 

hoặc trang trí chìa khóa của bạn trong POCO với:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] //Fixed typo 
public Int64 PolicyID { get; set; } 
+0

Đây phải là câu trả lời được chấp nhận. – Rap

+1

Tôi tin rằng cờ enum cho thuộc tính đó là "DatabaseGeneratedOption" và không phải "DatabaseGenerationOption" –

+0

Nó làm việc cho tôi cũng có thể giải thích tại sao nó xảy ra như thế nào thuộc tính này giải quyết vấn đề. – Shrivallabh

2

tôi cố định này bằng cách thiết lập StoreGeneratedPattern trên các thuộc tính cột để Computed.

Từng bước dưới đây:

  1. Mở EDMX của bạn (double click trong Visual Studio)
  2. Nhấp chuột phải vào cột đó gây ra vấn đề, chọn Properties.
  3. Thay đổi StoreGeneratedPattern thành Computed.

From the IDE enter image description here

Hy vọng rằng sẽ giúp ai đó.

+0

Câu hỏi dành riêng cho mã đầu tiên – Suamere

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