我正在尝试创建一个 CustomAuthUserSession 以及使用 RefIdStr 属性将我自己的用户文档与 UserAuth 对象相关联。
在我的 CustomUserAuthSession 的 OnAuthenticated 方法中,我正在执行以下操作
- 通过会话上的 UserAuthId 获取 userAuth 对象
- 为 Raven 创建一个 IDocumentSession 实例
- 创建用户的新实例并在我的文档会话中调用 Store
- 在 userAuth 上更新 RefIdStr
- 在我的 userauth repo 上调用 SaveUserAuth
这是方法
public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
{
base.OnAuthenticated(authService, session, tokens, authInfo);
var documentSession = authService.TryResolve<IDocumentSession>();
//get userAuth from raven
//var userAuth = documentSession.Load<UserAuth>(session.UserAuthId); //should this work?
var userAuthRepo = authService.ResolveService<IUserAuthRepository>();
var userAuth = userAuthRepo.GetUserAuth(session.UserAuthId);
if (userAuth.RefIdStr == null)
{
//need to create new User and save to Raven
var newUser = new User()
{
UserName = session.UserName,
Email = session.Email,
//Other properties...
};
documentSession.Store(newUser);
this.UserID = newUser.Id; //UserId property on custom session
userAuth.RefIdStr = newUser.Id;
userAuthRepo.SaveUserAuth(userAuth); //getting error here...
}
else
{
//get User from raven
var user = documentSession.Load<User>(userAuth.RefIdStr);
this.UserID = user.Id;
}
}
当我使用 SaveUserAuth 方法时,我收到以下错误...
Attempted to associate a different object with id 'UserAuths/12345'.
这是我设置文档存储和 IOC 的方式...
//Set up RavenDB
var ravenStore = new DocumentStore()
{
ConnectionStringName = "RavenDB"
}.Initialize();
IndexCreation.CreateIndexes(typeof(RavenUserAuthRepository).Assembly, ravenStore);
container.Register(ravenStore);
container.Register(c => c.Resolve<IDocumentStore>().OpenSession()).ReusedWithin(ReuseScope.Request);
以及我如何配置我的身份验证回购......
//register auth repository
container.Register<IUserAuthRepository>(p => new RavenUserAuthRepository(p.Resolve<IDocumentStore>(), p.Resolve<IDocumentSession>()));
var authRepo = (RavenUserAuthRepository)container.Resolve<IUserAuthRepository>();
任何想法为什么会发生此错误?
编辑
只是为了澄清......我的意图是让它以与 socialbootstrapapi 项目类似的方式工作。
编辑 2
根据下面的评论,我已将 IUserAuthRepository 的 Funq 注册更改为:
container.Register<IUserAuthRepository>(p => new RavenUserAuthRepository(p.Resolve<IDocumentStore>(), p.Resolve<IDocumentSession>())).ReusedWithin(ReuseScope.Request);
但我仍然遇到同样的错误......