У меня прекрасная проблема в моем решении ...
На объект сущности нельзя ссылаться несколькими экземплярами IEntityChangeTracker
Это связано с тем, чтореализация UserManager
и, в основном, остальная часть кода, похоже, используют разные экземпляры DbContext
.
Проблема, с которой я столкнулся, заключается в том, что UserManager
использует версию более низкого уровняDbContext
в дереве наследования (существует около 4 уровней унаследованного DbContext
- это огромный объем унаследованного кода, поэтому изменить его сейчас не для меня).
Вот UserManager
...
public class MyUserManager : UserManager<User, int>
{
private readonly BaseDbContext db;
public MyUserManager(BaseDbContext dbContext)
: base(new UserStore<User, Role, int, UserLogin, UserRole, UserClaim>(dbContext))
{
db = dbContext;
var provider = new DpapiDataProtectionProvider("My");
UserValidator = new UserValidator<User, int>(this) { AllowOnlyAlphanumericUserNames = false };
UserTokenProvider = new DataProtectorTokenProvider<User, int>(provider.Create("MyTokenProvider"));
}
}
Все остальное использует класс с именем MainDbContext
, который наследуется от AnotherDbContext
, а затем BaseDbContext
. AnotherDbContext
не используется нигде, что имеет значение, поэтому мой Ninject настроен следующим образом ...
private static IKernel RegisterDatabase(this IKernel kernel)
{
kernel.Bind<BaseDbContext>().To<MainDbContext>().InRequestScope();
kernel.Bind<MainDbContext>().ToSelf().InRequestScope();
return kernel;
}
(я использую свободные методы для всех настроек IoC, поэтому этот метод вызывается в основной настройке).
Я думал, что это будет делать то, что я хочу (используйте разрешение экземпляра MainDbContext по всем направлениям), но это не так - кажется, я получаю 1 экземпляр для UserManager
и 1 для всего остального. Это решает хорошо (я получаю правильные ТИПЫ), но случай, который отличается, является нарушителем.
Есть идеи?