我正在使用工作单元模式,并在一个名为MyProject的单独子项目中为其定义了一个类。领域DAL。工作单位。
不幸的是,整个ASP。Net Identity基础设施在我的主要项目(如教程中所述(MyProject中。
更麻烦的是:据我所知,ASP。NET标识使用自己的DBContext:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationDbContext"/> class, using the EFDB context.
/// </summary>
public ApplicationDbContext()
: base("EFDBContext", throwIfV1Schema: false)
{
}
/// <summary>
/// Creates this instance.
/// </summary>
/// <returns>A database context</returns>
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
我有一个名为Project的类,它应该有一个与它相关联的用户,但如何做到这一点,而不使用冲突的数据库上下文?
示例:
public class Project
{
public ApplicationUser User {get; set;}
}
示例调用代码:
public class IndexController : Controller
{
// uow and userManager are instantiated through Ninject
// example code, normally this would be properties of the controller
public ActionResult Create(IUnitOfWork uow, ApplicationUserManager userManager, int someID )
{
Project newProject = new Project();
ApplicationUser user = await UserManager.FindByIdAsync(someID);
// this should give a conflict, since two different DataContexts are involved
newProject.User = user;
uow.Projects.Insert(newProject);
uow.Save()
return this.View();
}
}
}
模板有点令人困惑。您不应该创建单独的自己的DbContext
,而应该使用数据模型的其余部分来扩展现有的ApplicationDbContext
。只要更改IdentityConfig.cs
中的类型,就可以将其移动到项目中的其他位置。
然而,当使用工作单元时,有一个更难解决的问题,那就是ASP。NET Identity方法在内部调用SaveChanges()
,当使用工作单元时,通常只需要在完成所有工作后才调用。一个变通方法可以是使用TransactionScope()
,但在ASP的每个请求DbContext之前创建它可能会很麻烦。NET Identity使用。