2013-04-19 45 views
5

Mới cho tất cả điều này: Tôi có một mô hình cho Ký tự có thuộc tính UserProfile, để một ký tự có thể được hỗ trợ với một mục nhập UserProfile. Điều này sẽ làm cho UserProfile một khóa ngoại cho một nhân vật.Truy cập UserProfile từ bộ điều khiển MVC 4

nhân vật mẫu:

public class Character 
{ 
    public int ID { get; set; } 
    public virtual UserProfile user { get; set; } 
    public string name { get; set; } 
... 
} 

(tôi đã sở hữu UserProfile ảo vì bài khác, không chắc chắn nếu điều này nên ở lại)

Khi tạo một nhân vật mới tôi muốn thiết lập thuộc tính người sử dụng ký tự đó cho đối tượng của người dùng web hiện tại thực hiện yêu cầu. Ví dụ ở đây là quá trình người dùng sẽ có được để làm cho một nhân vật: Đăng nhập/Tạo tài khoản người dùng với trang web Nhấp vào 'Tạo nhân vật'

[HttpPost] 
public ActionResult Create(Character character) 
{ 
    if (ModelState.IsValid) 
    { 
     character.user = ??? 
     db.Characters.Add(character); 
     db.SaveChanges(); 
     ... 
} 

Vấn đề là tôi không biết làm thế nào để truy cập vào bảng UserProfile từ bộ điều khiển của tôi. Thông thường để truy cập vào một bảng, tôi tạo một đối tượng của dbContext của tôi nhưng bảng UserProfile đang sử dụng ngữ cảnh MVC 4 mặc định trong khi tất cả các đối tượng khác của ứng dụng của tôi đang sử dụng một dbContext khác.

Tôi đoán có một số giải pháp đối với tôi, không ai trong số đó tôi có thể tìm ra cách để làm:

  1. Tôi có nên thiết lập ứng dụng của tôi vì vậy tất cả các bảng sử dụng 1 dbContext? Nếu vậy, làm thế nào?
  2. Có cách nào để tạo đối tượng của dbContext mặc định mà UserProfile đang sử dụng không?

Xin lỗi trước nếu có bất kỳ thuật ngữ nào của tôi bị tắt hoặc nếu tôi để lại thông tin quan trọng. Tôi sẽ cung cấp thêm khi cần thiết. Cảm ơn

Trả lời

3

Tôi thường lưu ID người dùng hiện tại trong biến phiên và sau đó truy xuất người dùng đó từ DB khi tôi cần. Vì vậy, các mã có thể giống như thế:

[HttpPost] 
public ActionResult Create(Character character) 
{ 
    if (ModelState.IsValid) 
    { 
     character.user = db.UserProfiles.Find(u => u.UserID = (int) Session["UserID"]); 

     db.Characters.Add(character); 
     db.SaveChanges(); 
    ... 
} 
+1

Ngoài ra, tôi nghĩ anh ấy có thể bị nhầm lẫn nếu anh ấy quên mất quyền sở hữu của thực thể 'UserProfile'. Chris, nhìn vào 'AccountModels.cs'. Nên có một 'DbContext' riêng biệt có tên là' UsersContext'. Hoặc bạn có thể sử dụng nó hoặc kết hợp nó với của riêng bạn. – Matt

+2

Tôi rất khuyên bạn nên sở hữu nó bằng cách di chuyển nó vào của riêng bạn và xóa 'UsersContext' hoàn toàn. – Matt

+0

Matt, bạn nói đúng, đây là những gì tôi muốn làm. Tôi đã không chắc chắn nếu nó có thể, nơi để tìm người dùngContext và làm thế nào để làm điều này. Nếu bạn sẵn sàng viết câu trả lời của riêng bạn với một chút chi tiết hơn về cách làm điều này, tôi thực sự đánh giá cao nó. Cảm ơn! –

7

Khi bạn đăng nhập thông tin người dùng của bạn như UserId hoặc UserName sẽ được lưu trữ trong

WebSecurity.CurrentUserId

WebSecurity.CurrentUserName

[HttpPost] 
public ActionResult Create(Character character) 
{ 
    if (ModelState.IsValid) 
    { 
     character.user = db.UserProfiles.Find(u => u.UserID = WebSecurity.CurrentUserId); 

     db.Characters.Add(character); 
     db.SaveChanges(); 
    ... 
} 
+0

toán tử bình đẳng, db.UserProfiles.Find (u => u.UserID == WebSecurity.CurrentUserId); – Dughall

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