1

我正在使用web api 2並創建要保存到數據庫的消息對象。該消息對象需要將當前用戶作爲應用程序用戶類型存儲在其上。如何將當前用戶作爲網絡api模型的屬性存儲

我的代碼如下所示:

 var UserManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     var currentUser = RequestContext.Principal; 
     var currentUserName = currentUser.Identity.Name; 
     var currentApplicationUser = UserManager.FindByName(currentUserName); 

     // I perhaps want to dispose of the user context? 
     // UserManager.Dispose(); 

     globalMessage.sentBy = currentApplicationUser; 
     db.GlobalMessages.Add(globalMessage); 

最後一行拋出錯誤:An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

有沒有解決這個另一種方式。否則,我想,我可以調用一個獲取當前用戶的動作,將該用戶的動作重定向到另一個動作作爲參數,然後執行更新?

回答

0

問題是,您正在附加到您的db上下文中,該實體(currentApplicationUser)已連接到另一個活動的上下文實例,因此解決方案可能是使用相同的上下文查找用戶,在您的情況下它會是這樣的:

var UserManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    var currentUser = RequestContext.Principal; 
    var currentUserName = currentUser.Identity.Name; 
    var currentApplicationUser =db.AspNetUsers.FirstOrDefault(u=>u.UserName==currentUserName); 

    globalMessage.sentBy = currentApplicationUser; 
    db.GlobalMessages.Add(globalMessage); 
+0

感謝。我會選擇你的,因爲你在我之前3分鐘就到了那裏。很高興看到你以同樣的方式做到了。 – Sam

+1

不客氣,我的朋友;) – octavioccl

1

我的工作了:

var currentUser = RequestContext.Principal; 
    var currentUserName = currentUser.Identity.Name; 
    var sender = db.Users.Where(u => u.UserName == currentUserName).FirstOrDefault(); 
    globalMessage.sentBy = sender; 
    db.GlobalMessages.Add(globalMessage); 
    db.SaveChanges(); 
相關問題