2012-03-04 29 views
12

Tôi đã có ứng dụng web MVC sử dụng SQL Server 2008 làm cơ sở dữ liệu phía sau cùng với Khuôn khổ thực thể. Ứng dụng này hoạt động tốt và kéo dữ liệu từ cơ sở dữ liệu tốt. Vấn đề của tôi là, khi nó cập nhật dữ liệu, nó dường như không lưu nó. Tôi đang sử dụng chức năng theo dõi:Khuôn khổ thực thể không lưu thay đổi

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 

     context.SaveChanges(); // Breakpoint here 
    } 

Chức năng này được xác định trong mã vùng của tôi. Tôi thiết lập một điểm ngắt trên dòng đã nhận xét ở trên và ứng dụng đang phá vỡ ở dòng, vì vậy tôi biết nó đánh vào dòng đó và những thay đổi đều tốt trong đối tượng ngữ cảnh. Không có lỗi xảy ra, EF chỉ đơn giản là không lưu các thay đổi vì một lý do nào đó.

Tôi tin rằng chuỗi kết nối của tôi là đúng, vì kéo nó dữ liệu tốt, nhưng ở đây nó chỉ là trong trường hợp:

<connectionStrings> 
    <add name="EFDbContext" connectionString="Data Source=localhost;Initial Catalog=WarehouseStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

Bất cứ ai có bất cứ ý tưởng về những gì có thể gây ra điều này?

+0

giả sử bạn đang chạy với SQL Server :-) bạn đã bật trình thu thập SQL chưa và xem liệu EF có đang gửi bất kỳ truy vấn nào đến DB không? phải có trước khi bất kỳ savechanges được thực hiện là một mục đăng nhập trong profiler từ EF. –

+0

Bạn đã kiểm tra nếu bạn nhấn 'context.Products.Add (sản phẩm);' Nếu không, không có gì đang được lưu. – veblock

+0

@ Ricky.G - Ý tưởng hay, tôi sẽ thử rằng – Icemanind

Trả lời

32

Nếu bạn là sau khi các chức năng chèn/cập nhật, bạn phải bao gồm cả hai trường hợp:

if (product.ProductID == 0) 
{ 
    context.Entry(product).State = EntityState.Added; 
} 
else 
{ 
    context.Entry(product).State = EntityState.Modified; 
} 
context.SaveChanges(); 
+0

Thay đổi này đã khắc phục được sự cố của tôi! Cảm ơn! – Icemanind

+1

Có lý do nào mà EF không biết điều này với việc được thông báo ... sau tất cả tôi đã gọi phương thức cộng. Nó hoạt động trên chỉnh sửa hiện có – Chad

+2

Khi bạn chỉnh sửa hiện có, bạn nhận được nó từ EF đầu tiên, vì vậy EF theo dõi trạng thái của đối tượng. Khi bạn thêm một cái mới, bạn tạo đối tượng bên ngoài EF, do đó khi bạn thêm nó, bạn phải nói rõ với EF để thêm nó. – veblock

2

bạn có thể sử dụng Tạo phương pháp của ngữ cảnh: sử dụng phương pháp này thường khi bạn có một thực thể có liên quan

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      product = context.Products.Create(); 
      product.property = ...; 
      product.property = ...; 

      context.Products.Add(product); 
    } 

    context.SaveChanges(); // Breakpoint here 
} 
3

Nhờ @veblok tôi đã tìm ra giải pháp cho vấn đề của mình. Có một tùy chọn trong lớp DbContext để ngăn EF theo dõi đối tượng theo mặc định. Sau khi gỡ bỏ, EF bắt đầu hoạt động như mong đợi.

public class My Context : DbContext { 
    public MyContext() 
    { 
     // REMOVE this or use veblok's solution 
     this.Configuration.AutoDetectChangesEnabled = false;    
    } 
    ... 
} 
+0

thuộc tính 'AutoDetectChangesEnabled' có thể cải thiện hiệu suất (và dung lượng bộ nhớ) cho các truy vấn chỉ đọc - vì vậy nếu bạn thấy điều này trong cơ sở mã của bạn không loại bỏ nó mà không kiểm tra. nếu bạn chỉ đang thực hiện cập nhật đơn giản bên trong một phương thức đang thực hiện đọc phức tạp thì bạn có thể muốn tạo ngữ cảnh dữ liệu mới cho bản cập nhật –

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