2012-06-19 24 views
12

Tôi sử dụng Entity Framework 4.0. Có thể là SaveChanges() trả về 0 nhưng không ném ngoại lệ? Ví dụ: sau khi thêm.Có thể, DbContext.SaveChanges() trả về 0 nhưng không có ngoại lệ?

Đây là mã của tôi:

try 
{ 
    _context.CodeProducts.Add(entity); 
    _context.SaveChanges(); 

    //Shell I control return result from SaveChanges() in here. 
    //However doesn't throw an exceoption? 

    return new MethodResponse() 
    { 
     ResultText = "Successful", 
     Type = MethodResponse.ResponseType.Succeed 
    }; 
} 
catch (OptimisticConcurrencyException exc) 
{ 
    throw exc; 
} 
catch (UpdateException exc) 
{ 
    throw exc; 
} 
catch (Exception exc) 
{ 
    throw exc; 
} 
+1

Có điều gì cần tiết kiệm? –

+2

Bạn cần thêm thông tin khác nếu không ai sẽ không thể trợ giúp. Bạn có thể gửi mã của bạn? –

+0

Tôi đã thêm mã của mình. – cagin

Trả lời

19

Theo the documentation, giá trị trả về của DbContext.SaveChanges

Số lượng đối tượng ghi vào cơ sở dữ liệu cơ bản.

Vì vậy, những gì bạn thấy chỉ có thể thực hiện được, khi không có đối tượng nào cần được lưu vào cơ sở dữ liệu.

+0

Đúng - ví dụ: nếu bạn xóa một hàng không còn tồn tại nữa, bạn sẽ nhận được 0 hàng bị ảnh hưởng – Carsten

+1

@ CarstenKönig Không, nếu bạn xóa một hàng không tồn tại nữa, cơ sở dữ liệu sẽ trả về "0 hàng bị ảnh hưởng" và EF sẽ dịch nó thành một ngoại lệ. "không có mục nào cần được lưu" nghĩa là không có thay đổi nào trong ngữ cảnh trước khi 'SaveChanges' được gọi. – hvd

+0

thực sự? Phải thử nó nhưng tôi nghĩ rằng tôi đã có những vấn đề tương tự trong quá khứ mà không nhận được một ngoại lệ nhưng cảm ơn bạn đã sửa chữa – Carsten

3

db.SaveChanges của khung thực thể() để xóa và lưu trả về số hàng đang được thực hiện. Trong thử nghiệm bằng cách sử dụng khuôn khổ Fakes (stubs và shims), tuy nhiên, giá trị trả về sẽ luôn luôn là 0. Nếu có một lỗi trong cuộc gọi, sau đó một ngoại lệ sẽ được ném. Hàm ý là bất kỳ phương thức gọi nào dựa vào một giá trị lớn hơn 0 được trả về từ db.SaveChanges để xác nhận không thể được kiểm tra cho cùng một giá trị đó. Điều này có thể chứng minh quan trọng khi một phương thức đang sử dụng giá trị trả về db.SaveChanges() để đánh giá số hàng bị ảnh hưởng trong một hoạt động nhất định.

0

câu trả lời của tôi là không đề cập về DbContext, nhưng nếu ai đó đang sử dụng XEntities và nhận được cùng một vấn đề, bạn có thể thử:

using (var entities = new XEntities()) 
{ 
    var product = entities.Products.SingleOrDefault(x => x.Id == id); 
    product.Type = "New type"; // modifying 

    int flag = entities.SaveChanges(); // 1 
    // or await entities.SaveChangesAsync(); // 1 
} 

Vấn đề:

public class Demo 
{ 
    private XEntities _entities = new XEntities(); 

    public void Test(int id) 
    { 
     var product = _entities.Product.SingleOrDefault(x => x.Id == id); 
     product.Type = "New type"; // modifying 

     int flag = _entities.SaveChanges(); // 0 <<<==== 
     // or await entities.SaveChangesAsync(); // 0 <<<==== 

     // you need to create new instance of XEntities to apply changes 
    } 
} 
Các vấn đề liên quan