5

Lúc đầu, tôi nên đề cập đến vấn đề này chỉ xảy ra trong các ứng dụng biểu mẫu cửa sổ và chương trình tương tự trong chế độ web chẳng hạn với MVC3 hoạt động hoàn hảo.Khuôn khổ thực thể không lưu mục nhập dữ liệu trong cơ sở dữ liệu

Một số ngày trước, tôi đã viết một chương trình biểu mẫu cửa sổ rất đơn giản bằng cách sử dụng Visual studio 2010 cuối cùng với cơ sở dữ liệu SQL Express. Tôi đã thêm cơ sở dữ liệu bằng cách chọn Thêm> Mục mới> Cơ sở dữ liệu dựa trên dịch vụ và mô hình dữ liệu thực thể dựa trên cơ sở dữ liệu này theo cùng một cách. Tôi đã sử dụng khung Entity để thêm một số bản ghi mới vào các bảng. Tôi đã làm điều đó với VS 2008 SP1 trước khi không có vấn đề vì vậy tôi đã làm như vậy. Chương trình được biên dịch và chạy không có lỗi và tôi đã nhập một số dữ liệu mới. sau khi thoát khỏi chương trình, tôi quay trở lại cơ sở dữ liệu và không có gì xảy ra. Không có thông tin nào tôi đã nhập đã được lưu. Tôi gỡ lỗi chương trình từng bước và mọi thứ đều ổn. Mã bên dưới có liên quan đến một chương trình rất đơn giản có vấn đề được đề cập. Cơ sở dữ liệu có một bảng (sách):

namespace Book 
{ 
    public partial class BookForm : Form 
    { 
     BookDatabaseEntities db = new BookDatabaseEntities(); 

     public BookForm() 
     { 
      InitializeComponent(); 
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      Book bookToCreate = new Book(); 

      bookToCreate.Id = Guid.NewGuid(); 
      bookToCreate.Title = titleTextBox.Text; 

      db.Books.AddObject(bookToCreate); 
      db.SaveChanges(); 
     } 
    } 
} 

Tôi sẽ rất biết ơn nếu có ai giúp tôi. Cảm ơn trước.

.................

Sau khi chỉnh sửa:

namespace Book 
{ 
    public partial class BookForm : Form 
    { 
     //BookDatabaseEntities db = new BookDatabaseEntities(); 

     public BookForm() 
     { 
      InitializeComponent(); 
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      var db = new BookDatabaseEntities(); 
      var bookToCreate = db.Books.CreateObject(); 

      //Book bookToCreate = new Book(); 

      bookToCreate.Id = Guid.NewGuid(); 
      bookToCreate.Title = titleTextBox.Text; 

      db.AcceptAllChanges(); 
      db.Books.AddObject(bookToCreate); 
      db.SaveChanges(); 
     } 
    } 
} 
+0

cố gắng để thay thế "db.Books mới();" với "db.Books.CreateObject();" –

+0

Đảm bảo rằng bạn đang kiểm tra cơ sở dữ liệu chính xác. –

+0

@Davide: Tôi đã sử dụng CreateObject như bạn đã nói nhưng vấn đề vẫn tồn tại. – Monoloox

Trả lời

4

Cuối cùng sau rất nhiều tìm kiếm và yêu cầu tôi tìm thấy giải pháp trong MSDN diễn đàn nhờ Patrice Scribe Bạn có thể nhìn thấy nó here

+0

Cảm ơn Monoloox.Sau khi tìm kiếm lâu cuối cùng tôi đã nhận được câu trả lời từ bạn. –

1

thử điều này:

db.Attach(bookToCreate); 
db.SaveChanges(); 

Edit:

Tôi có mã này trong thư viện lớp học (DAL của tôi) trong quá trình sản xuất và hoạt động tốt:

using (var dbContext = new DbEntities()) 
    { 
     var job = dbContext.RiskToolJob.CreateObject(); 

     job.AnalysisDataID = analysisDataID; 

     job.JobRmsAnalysisID = RMSAnalysisID; 
     job.UserName = userName; 

     job.JobCreated = DateTime.UtcNow; 

     dbContext.RiskToolJob.AddObject(job); 

     dbContext.SaveChanges(); 

     return job.DataId; 
    } 

thông báo rằng trong thực tế tôi không gán PK (DataId) bởi vì nó sẽ được chỉ định bởi các cơ sở dữ liệu, tôi trả lại cho người gọi nên đã gọi phương pháp tiết kiệm để bé biết tự tạo ID, trong trường hợp nó cần nó.

+0

Kính gửi Davide ... Tôi đã làm những gì bạn nói nhưng kết quả vẫn như cũ. Tôi nghĩ rằng vấn đề là về phương pháp SaveChanges() vì sau khi thực hiện (db.Books.AddObject) hoặc (db.Books.Attach) đối tượng đã được thêm vào ObjectStateManager và có vẻ như SaveChanges không thể lưu nó vào cơ sở dữ liệu. Tuy nhiên nó báo cáo không có lỗi trong quá trình nhập – Monoloox

+0

Một điều khác .. Như tôi đã nói khi tôi viết cùng một mã trong biểu mẫu web hoặc MVC nó hoạt động mà không có vấn đề này. Nó chỉ xảy ra trong các ứng dụng dạng cửa sổ và tôi không biết tại sao. – Monoloox

+0

Davide tại sao db.Attach giúp đỡ? Từ các tài liệu MS - "db.Attach được sử dụng để tái tạo lại một ngữ cảnh với một thực thể được biết đã tồn tại trong cơ sở dữ liệu. Do đó, SaveChanges sẽ không cố chèn một thực thể được đính kèm vào cơ sở dữ liệu vì nó được giả định là đã có" – Izzy

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