2015-10-13 13 views
5

Tôi nhận thấy rằng việc cập nhật các thực thể mà không chọn chúng trước tiên là một vấn đề phổ biến và nhiều giải pháp đã có trên StackOverflow, tuy nhiên sau khi đọc chúng tôi vẫn gặp sự cố.Cập nhật một thực thể với các thuộc tính bắt buộc trong Entity Framework

Tôi đang sử dụng đoạn mã sau để cập nhật một entitiy User:

using (var context = GetContext()) 
    { 
    var userEntity = new UserEntity() { ID = userUpdate.ID }; 
    context.Users.Attach(userEntity); 
    context.Entry(userEntity).CurrentValues.SetValues(userUpdate); 
    context.SaveChanges(); 
    } 

Tuy nhiên kết quả này trong một DbEntityValidationException bị ném vì tài entitiy của tôi có một số tính chất bắt buộc nhưng chúng không được thiết đặt trên được cập nhật thực thể.

Có cách nào xung quanh việc này hay chỉ đơn giản là trường hợp xóa thuộc tính bắt buộc?

Cảm ơn!

+1

Tại sao bạn không giới hạn các hàm tạo sẵn cho 'UserEntity' cho những người không khởi tạo nó trong trạng thái không hợp lệ? –

+0

Tôi không có giá trị cho các thuộc tính bắt buộc trong trường hợp này - một thực thể người dùng yêu cầu thuộc tính Email chẳng hạn, nhưng có lẽ chỉ tên của người dùng đang được cập nhật và do đó userUpdate không chứa gì khác. Nếu không chọn người dùng từ cơ sở dữ liệu, tôi không thể biết được những thuộc tính cần thiết nào được đặt thành. Chọn thực thể, sau đó cập nhật nó _does_ hoạt động, nhưng không thực sự lý tưởng khi tạo truy vấn không cần thiết nếu tôi không phải làm như vậy. –

+0

@NathanCooper Có cần phải là một nhà xây dựng không có tham số hoặc EF sẽ không thể tạo bất kỳ thực thể nào. – DavidG

Trả lời

4

Tôi đã tìm thấy một câu trả lời ở đây: Entity Framework/MVC3: temporarily disable validation

Bằng cách tạm thời tắt xác thực Tôi có thể bỏ qua các kiểm tra và chèn bất kỳ số lượng giá trị nào mà không truy xuất các thuộc tính bắt buộc trước:

using (var context = GetContext()) 
{ 
    var userEntity = new UserEntity() { ID = userUpdate.ID }; 
    context.Users.Attach(userEntity); 
    context.Entry(userEntity).CurrentValues.SetValues(userUpdate); 

    // Disable entity validation 
    context.Configuration.ValidateOnSaveEnabled = false; 

    context.SaveChanges(); 
} 
1

Nếu bạn chỉ muốn cập nhật lĩnh vực cụ thể trong tổ chức của bạn mà không cần phải lấy toàn bộ điều từ cơ sở dữ liệu đầu tiên:

var userEntity = new UserEntity() { ID = userUpdate.ID }; 
userEntity.SomeProperty = userUpdate.SomeProperty; 

//Tell EF to only update the SomeProperty value: 
context.Entry(userEntity).Property(x => x.SomeProperty).IsModified = true; 

context.SaveChanges(); 
+0

Thật không may điều này không giúp với vấn đề thuộc tính bắt buộc không được thiết lập. Một ngoại lệ vẫn được ném trừ khi tôi xóa các thuộc tính bắt buộc khỏi cấu hình. –

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