gpt4 book ai didi

ASP.NET 将 DbContext 注入(inject) Identity UserManager

转载 作者:行者123 更新时间:2023-12-02 14:08:58 25 4
gpt4 key购买 nike

我有一个引用 AppUser 模型的问题模型。这是一个 1 到 * 的关系,因为 1 个 AppUser 有很多问题,并且一个问题属于 1 个 AppUser。我的问题类如下所示:

public class Question
{
public int Id { get; set; }
public string Subject { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
public int NumOfViews { get; set; }
public AppUser LastAnswerBy { get; set; }

public AppUser AppUser { get; set; }
public ICollection<Comment> Comments { get; set; }
}

所以我尝试向 Controller 中的数据库添加一个新问题,如下所示:

[HttpPost]
public ActionResult PostQuestion(Question question)
{
if (ModelState.IsValid)
{
var id = User.Identity.GetUserId();
var user = UserManager.Users.FirstOrDefault(x => x.Id == id);
question.Date = DateTime.Now;
question.AppUser = user;

_context.Questions.Add(question);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(question);
}

private AppUserManager UserManager
{
get { return HttpContext.GetOwinContext().GetUserManager<AppUserManager>(); }
}

使用这段代码我得到一个像这样的异常:实体对象不能被 IEntityChangeTracker 的多个实例引用。因此,经过一番搜索后,问题似乎是我的 Controller 和 AppUserManager 类有两个不同的 DbContext 实例,解决方案是将其注入(inject)到这些类中。将它注入(inject)到我的 Controller 中没有问题,但我不知道如何将它注入(inject)到我的 UserManager 类中,如下所示:

public class AppUserManager : UserManager<AppUser>
{

public AppUserManager(IUserStore<AppUser> store)
: base(store)
{ }

public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options,
IOwinContext context)
{
AppIdentityDbContext db = context.Get<AppIdentityDbContext>();
AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db));

return manager;
}
}

它是从我的 IdentityConfig 类调用的,如下所示:

public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext<AppIdentityDbContext>(AppIdentityDbContext.Create);
app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
app.CreatePerOwinContext<AppRoleManager>(AppRoleManager.Create);

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
});

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}

我的问题可能是我不太了解身份部分。非常感谢任何帮助

解决方案:正如托比亚斯所说,我正在使用 2 个不同的上下文来更新数据库。像这样获取上下文是有效的:

private AppIdentityDbContext Context
{
get { return HttpContext.GetOwinContext().Get<AppIdentityDbContext>(); }
}

最佳答案

您的问题很可能是您正在尝试在两个不同的上下文中做一件事。您正在使用一个上下文查找用户,并尝试使用另一个上下文更新数据库。要解决此问题,您应该在 Controller 中实例化上下文,如下所示:

_context = HttpContext.GetOwinContext().Get<AppIdentityDbContext>();

这样,您就可以获得用于实例化您的 AppUserManager 的相同上下文。

如果我写错了或者不清楚,请评论。 :)

关于ASP.NET 将 DbContext 注入(inject) Identity UserManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29582393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com