Asp.net 如何将当前用户存储为web api模型上的属性

Asp.net 如何将当前用户存储为web api模型上的属性,asp.net,entity-framework,asp.net-web-api,oauth,asp.net-web-api2,Asp.net,Entity Framework,Asp.net Web Api,Oauth,Asp.net Web Api2,我正在使用WebAPI2并创建一个消息对象来保存到数据库中。此消息对象需要将当前用户作为应用程序用户类型存储在其上 我的代码如下所示: var UserManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); var currentUser = RequestContext.Principal; var currentUserName = c

我正在使用WebAPI2并创建一个消息对象来保存到数据库中。此消息对象需要将当前用户作为应用程序用户类型存储在其上

我的代码如下所示:

        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);
var UserManager=Request.GetOwinContext().GetUserManager();
var currentUser=RequestContext.Principal;
var currentUserName=currentUser.Identity.Name;
var currentApplicationUser=UserManager.FindByName(currentUserName);
//我可能想处理用户上下文?
//UserManager.Dispose();
globalMessage.sentBy=currentApplicationUser;
db.GlobalMessages.Add(globalMessage);
最后一行抛出错误:
一个实体对象不能被多个IEntityChangeTracker实例引用。


还有别的办法吗。否则,我想,我可以调用一个操作来获取当前用户,将该用户作为arg重定向到另一个操作,然后执行更新

问题是,您正在将一个实体(
currentApplicationUser
)附加到
db
上下文,该实体已经附加到另一个也处于活动状态的上下文实例,因此解决方案可能是使用相同的上下文查找用户,在您的情况下,它类似于:

    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);
var UserManager=Request.GetOwinContext().GetUserManager();
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);
我算出了:

    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();

谢谢我会选择你的,因为你比我早3分钟到达那里。很高兴看到你也这么做了。