2011-08-13 27 views
5

Tôi có một mô hình người dùng với hai thuộc tính chuỗi [NotMapped] Password và ConfirmPassword. Đây là những unmapped vì tôi lưu mật khẩu như mảng byte (sau khi salting) vì vậy có hai thuộc tính bổ sung (ánh xạ) InternalPassword và Salt trong mô hình người dùng.Làm thế nào để ngăn EF từ việc xác thực các thuộc tính không được ánh xạ trong DBContext.SaveChanges()

Vấn đề là khi tôi sử dụng mô hình người dùng để thay đổi mật khẩu, khung thực thể ném lỗi DBEntityValidation cho biết "Thuộc tính Mật khẩu là bắt buộc". Những gì tôi hiểu ở đây là EF đang cố gắng xác thực mô hình của tôi trước khi lưu và vì mật khẩu/ConfirmPassword không được thiết lập, nó đang ném lỗi này. Điều này đặt ra các câu hỏi sau:

1) Nếu thuộc tính Mật khẩu được kết hợp rõ ràng là [Chưa được lập bản đồ], tại sao EF xác thực trong khi lưu? 2) Nếu EF thực hiện xác nhận trong quá trình lưu, và điều tương tự cũng được thực hiện trong quá trình liên kết (I.E. trong phương thức hành động của bộ điều khiển), nó có ảnh hưởng đến hiệu năng không? (xác thực hai lần) 3) Cách được khuyến nghị để giải quyết lỗi này là gì? (Nếu tôi đặt rõ ràng thuộc tính Mật khẩu thành giá trị giả, lỗi đã biến mất.)

Chỉnh sửa: Tôi đã xóa mã vì nó dài và có thể là nguyên nhân chưa có câu trả lời. Nếu ai đó muốn có một cái nhìn, tôi có thể gắn nó dưới đây.

+0

Điều này là lạ bởi vì ngay cả khi thuộc tính 'Mật khẩu' được ánh xạ, nó sẽ không được yêu cầu theo mặc định vì các thuộc tính' string' không bao giờ được yêu cầu trừ khi bạn chỉ rõ thuộc tính '[Required]' trên thuộc tính hoặc gọi ' IsRequired() 'trong API thông thạo. Bạn có cài đặt như vậy cho thuộc tính 'Mật khẩu' không? – Slauma

+0

@Slauma yes Tôi đã yêu cầu thuộc tính được chỉ định trên Mật khẩu. Điều này là cần thiết để nhắc người dùng điền vào trường mật khẩu trong quá trình đăng ký. Nhưng vì điều này không được lập bản đồ, tại sao EF cố gắng xác thực nó trong quá trình lưu? –

Trả lời

9

Xác thực tự động trong EF là tính năng lạ bằng cách nào đó - Tôi không thích nó. Bạn có thể đọc this article để tìm thấy một số thông tin làm thế nào để xác nhận tính chất vừa chọn nhưng tôi hy vọng bạn phải kích hoạt xác nhận điều đó bằng tay và tắt xác nhận toàn cầu bằng cách gọi:

context.Configuration.ValidateOnSaveEnabled = false; 

Vấn đề của bạn với NonMappedAttribute là thú vị. Tôi đã không đi sâu vào việc thực hiện xác nhận trong EFv4.1 nhưng nếu việc triển khai được xây dựng xung quanh các quy tắc giống như xác nhận chung dựa trên chú thích dữ liệu, nó chỉ sử dụng các thuộc tính bắt nguồn từ ValidationAttribute - NotMappedAttribute không được bắt nguồn từ ValidationAttribute.

Đó là một vấn đề khác của việc triển khai như vậy - nó kết hợp định nghĩa ánh xạ và xác thực nhưng hai tính năng này không giống nhau và không nên được thực hiện bởi cùng một API.

@alun đã xóa câu trả lời của mình - câu trả lời hợp lệ cho câu hỏi của bạn. Xác nhận của bạn thuộc về mô hình xem phụ thuộc vào hoạt động mà người dùng đang thực hiện. Nó không thuộc về mô hình kiên trì. Tại sao? Chính xác vì vấn đề hiện tại của bạn - mô hình kiên trì có thể chỉ giữ một bộ xác thực đơn và mọi hoạt động trong ứng dụng của bạn phải đảm bảo rằng tiêu chí xác thực cho tập hợp đó được đáp ứng = bạn phải đảm bảo rằng PasswordConfirmPassword được lấp đầy ngay cả khi hoạt động hiện tại của bạn không yêu cầu it => vấn đề.

+0

Tôi có các mô hình khác nhau để đăng ký và thay đổi mật khẩu. Vấn đề là mô hình đăng ký (Người dùng) đại diện cho bảng db trực tiếp với hai thuộc tính chuỗi chỉ bổ sung cho giao diện người dùng cho mật khẩu. Tôi có thể đã tạo ra một mô hình riêng biệt (xem) để đăng ký nhưng điều đó sẽ gây ra sự sao chép và không cần thiết sao chép các giá trị mô hình đăng ký vào mô hình Người dùng. –

+0

Tôi cũng đã phát hiện ra và đã triển khai ValidateOnSaveEnable trước câu trả lời này và có vẻ như đây là giải pháp hiển thị duy nhất hiện tại. –

+0

Đó không phải là trùng lặp. Đó là sự phân tách các mối quan tâm. –

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