Я создаю проект в EF6 и aspnet Identity.
Я столкнулся со следующей проблемой:
если я позвоню
var account = await FindByNameAsync(userName); // account.IsConfirmed = true
Я получаю искомую учетную запись (пример: isConfirmed = true).
Когда я вручную изменяю значение в своей базе данных (isConfirmed = true -> isConfirmed = false) и снова запускаю свой запрос, я все еще получаю свой старый объект учетной записи (isConfirmed = true)
var account = await FindByNameAsync(userName); // Should be account.IsConfirmed = false, but still gives me IsConfirmed = true
Я попытался добавить следующее в свой конструктор DbContext
> this.Configuration.ProxyCreationEnabled = false;
> this.Configuration.LazyLoadingEnabled = false;
Но это ничего не изменило.
Что я могу с этим поделать? Как долго хранятся кэшированные данные? Все сообщения, которые я видел, требуют, чтобы вы выполнили запрос (из .. в ..), но, видя, как я использую идентификатор aspnet, и у меня нет контроля над этими вещами, что я могу сделать?
Спасибо!
РЕДАКТИРОВАТЬ: добавлена информация dbContext
Мой IoC (Unity)
container.RegisterType<IUnitOfWork, UserManagementContext>(new HttpContextLifetimeManager<IUnitOfWork>());
container.RegisterType<IUserStore<Account>, UserStore<Account>>(new InjectionConstructor(container.Resolve<IUnitOfWork>()));
HttpContextLifeTimeManager:
public class HttpContextLifetimeManager<T> : LifetimeManager, IDisposable
{
public override object GetValue()
{
return HttpContext.Current.Items[typeof(T).AssemblyQualifiedName];
}
public override void SetValue(object newValue)
{
HttpContext.Current.Items[typeof(T).AssemblyQualifiedName] = newValue;
}
public override void RemoveValue()
{
HttpContext.Current.Items.Remove(typeof(T).AssemblyQualifiedName);
}
public void Dispose()
{
RemoveValue();
}
}
Мой IUnitOfWork
public interface IUnitOfWork : IDisposable
{
void Save();
Task SaveAsync();
DbSet<TEntity> EntitySet<TEntity>() where TEntity : class;
void MarkAsModified<TEntity>(TEntity entity) where TEntity : class;
}
Мой UserManagementContext
public class UserManagementContext : IdentityDbContext<Account>, IUnitOfWork
{
static UserManagementContext()
{
//Database.SetInitializer<UserManagementContext>(new RecreateDatabase());
Database.SetInitializer<UserManagementContext>(null);
}
public UserManagementContext()
: base("Name=UserManagementConnection")
{
this.Configuration.ProxyCreationEnabled = false;
this.Configuration.LazyLoadingEnabled = false;
}
// ... (my Dbsets)
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// configuration ..
}
public void Save()
{
SaveChanges();
}
public async Task SaveAsync()
{
await SaveChangesAsync();
}
public DbSet<TEntity> EntitySet<TEntity>() where TEntity : class
{
return this.Set<TEntity>();
}
public void MarkAsModified<TEntity>(TEntity entity) where TEntity : class
{
this.Entry(entity).State = EntityState.Modified;
}
}
ОБНОВЛЕНИЕ:
Я обнаружил еще одну странную вещь. Когда я устанавливаю поле даты последнего входа в систему, это изменение подхватывается, но когда я устанавливаю свое поле isConfirmed, оно не подхватывается.. (изменение БД фактически перезаписывается кэшированными данными!
Таким образом, это подтверждает, что данные, введенные с помощью кода, сохраняются, но ручные изменения в БД игнорируются.
ОБНОВЛЕНИЕ 2 На случай, если у кого-то возникнет эта проблема: проблема была не в удостоверении aspnet, а в EF.
Что я сделал, так это реализовал свой собственный пользовательский магазин и вручную получил доступ к EF и использовал .AsNoTracking(), чтобы избежать кэширования.