2009-08-28 35 views
9

Tôi đang cố gắng thiết kế mô hình thực thể cho một ứng dụng sử dụng thành viên ASP.Net để xác thực người dùng của nó. Trong hầu hết các lược đồ cơ sở dữ liệu mà tôi tạo, các bản ghi thường kết thúc với người dùng thông qua trường UserId trên bảng aspnet_users. Điều đó đã làm việc tốt cho tôi trong quá khứ, nhưng bây giờ tôi đang sử dụng EF, tôi đang gặp một số vấn đề khái niệm với việc tìm ra cách tôi sẽ tham khảo người dùng từ một thực thể. Ví dụ:Bạn sẽ sử dụng Entity Framework (1.0) với ASP.Net Membership như thế nào?

Ví dụ: giả sử chúng tôi có một thực thể "đăng" chứa thuộc tính "postedBy". Tôi muốn có thể làm được tên người dùng của người dùng đã tạo bài đăng này bằng một cái gì đó như post.user.username, nhưng tôi cảnh giác với việc tạo một thực thể dựa trên bảng aspnet_user vì sợ tạo ra một mô hình mà chúng ta hãy tôi bỏ qua lớp thành viên khi thực hiện thay đổi đối với cơ sở dữ liệu.

Tôi đã xem xét việc rời khỏi trường post.userId dưới dạng guid và sau đó yêu cầu bất kỳ mã nào cần biết tên người dùng sử dụng guid đó để đưa người dùng từ lớp Tư cách thành viên, nhưng điều đó có vẻ "không rõ ràng".

Có ai có bất kỳ đề xuất nào về thiết kế mô hình tổ chức tích hợp với tư cách thành viên không? Tôi sẽ được hợp lý xảy ra với một thực thể người dùng "chỉ đọc".

Trả lời

12

Lời khuyên của tôi là: "Không".

Hãy để tôi cụ thể hơn.

Sử dụng UserId làm ánh xạ, khóa ngoài ràng buộc mô hình tổ chức của bạn không thành viên ASP.NET nói chung, nhưng đối với Nhà cung cấp thành viên SQL nói chung. Điều gì sẽ xảy ra nếu bạn muốn sử dụng xác thực miền hoặc OpenID?

Đừng làm cho tôi sai: 99,9% thời gian chính xác để liên kết các tham chiếu DB cùng với khóa ngoại. Heck, bạn thậm chí có thể làm điều đó ở đây, nhưng không ánh xạ nó vào mô hình thực thể của bạn. Bạn cần phải giữ một bức tường phân tách hợp lý giữa các nhà cung cấp thành viên và dữ liệu của riêng bạn. Bạn truy cập dữ liệu của bạn thông qua EF. Bạn truy cập dữ liệu thành viên thông qua API thành viên. Thực tế là chúng xảy ra trong cùng một DB vì bạn tình cờ sử dụng nhà cung cấp thành viên SQL là một chi tiết thực hiện.

Cập nhật: Tôi đã mở rộng theo ý tưởng này trong a blog post.

+0

Vì vậy, nếu bạn có cột tham chiếu "người dùng" (như đăng) trong bảng dữ liệu, bạn đề xuất rằng nó được ánh xạ tới bảng người dùng riêng biệt (vì không có liên kết giữa bảng nhà cung cấp và bảng ứng dụng)? Vì vậy, cơ sở dữ liệu của bạn chứa 2 bảng người dùng riêng biệt mà sau đó phải được đồng bộ hóa (tức là bằng trình kích hoạt)? Nếu không, bạn có thể giải thích cách bạn làm điều đó không? Tôi có cùng một vấn đề ở đây nhưng tôi không cần phải có khả năng thay đổi nhà cung cấp (nó sẽ không xảy ra ...). –

+1

Chúng tôi không đồng bộ hóa chính xác. Chúng tôi có một bảng SystemUser mà không liên quan chặt chẽ đến aspNet_Users. Ví dụ: việc hủy đăng ký thành viên ASP.NET sẽ không xóa bản ghi SystemUser. Chúng tôi muốn giữ cho rằng xung quanh để các trường "CreatedBy" trên hồ sơ khác vẫn có thể chỉ vào một cái gì đó. Vì vậy, chúng tôi đã tùy chỉnh AccountController để cập nhật cả tư cách thành viên và bảng của chính chúng tôi khi người dùng được thêm hoặc xóa. –

+0

Ok cảm ơn. Tôi quên mất nguy cơ mất tài liệu tham khảo. Việc triển khai của bạn dường như là một điều tốt với tôi. –

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