2015-10-20 4 views
0

Я работаю над сайтом MVC, использующим идентификатор ASP.Net для входа в систему.MVC Asp.NET Identity Неизвестная ошибка Произошла ошибка

Существует таблица пользователей, где pk является FK для другой таблицы (таблица 2). Из-за этого пользователь не может быть удален. Кроме того, есть отчеты, которые генерируются из таблицы 2. В этом отчете отображаются данные из таблицы 2 до тех пор, пока имя пользователя, сгенерировавшее данные. Другая причина, по которой удаление информации пользователя не должно выполняться.

Таким образом, вместо того, чтобы удалять пользователя, я подумал, что добавлю столбец в таблицу пользователя, названную «Deleted». Он использует бит типа данных.

Этот столбец был добавлен в мою локальную копию базы данных с использованием первых кодов миграции. Когда пользователь входит в систему, это значение проверяется в этом столбце (0 = не удалено, 1 = удалено).

Все работает отлично на моей локальной машине. У меня не было ошибок, код прошел нормально. Мне удалось войти в систему с любым пользователем. Затем я развернулся на нашем тестовом сервере и добавил столбец «Удалено» в таблицу на тестовом SQL-сервере, используя скрипт.

Когда я пошел, чтобы войти в систему, с любым пользователем я не смог. Я продолжал получать «Ошибка входа в систему. Повторите ввод учетных данных и повторите попытку», даже несмотря на то, что мои учетные данные были правильными.

Я удалил файлы на сервере и развернул их снова. То же самое.

Я попятился все мои изменения и развернут снова и был в состоянии войти в Итак, я начал добавлять вещи кусок в то время:.

  • Я запускал скрипт, чтобы добавить Deleted колонки бит типа данных и установить , чтобы не было нуля на нашем тестовом SQL-сервере
  • Протестированный вход в систему и был удален
  • Добавлено public bool Deleted {get; набор;} на мой BL Entity и развернут тест
  • Пытался войти в систему и не удалось

  • Удалены Удаленные BOOL и повторно развернуты

  • Умел войти

Я не понимаю, почему это добавление вызывает проблемы. Столбцы «Удаленные» используются в других таблицах приложения и не вызвали никаких проблем. И поскольку он работает нормально, когда я запускаю его локально, мне сложно определить, в чем проблема.

Вот мой BL Entity:

using Microsoft.AspNet.Identity.EntityFramework; 
    using System; 
using System.Collections.Generic; 
namespace BlahBlah.BusinessLogic.Entities 
{ 
public class User : IdentityUser 
{ 
    public User() : base() { } 

    public User(string username) : base(username) { } 

    public Guid CompanyId { get; set; } 

    public Company Company { get; set; } 

    public bool PrimaryAccount { get; set; } 

    public Guid DefaultCompanyId { get; set; } 

    public ICollection<Transaction> Transactions { get; set; } 

    // public bool Deleted { get; set; } 

} 
} 

Вот часть моего кода user.js:

... 
$http(call) 
      .success(function (data) { 
       userData.isAuthenticated = true; 
       userData.username = data.userName; 
       userData.role = data.role; 
       userData.bearerToken = data.access_token; 
       userData.expirationDate = new Date(data['.expires']); 

       setHttpAuthHeader(); 

       if (typeof successCallback === 'function') { 
        successCallback(); 
       } 
      }) 
      .error(function (data) { 

       if (typeof errorCallback === 'function') { 
        if (data.error_description) { 
         errorCallback(data.error_description); 
        } 
        else { 

         errorCallback('Unable to contact server; please, try again later.'); 
        } 
       } 
      }); 
    }; 
... 

Вот часть моего кода login.js:

... 
function login(common, $location, config) { 
    var getLogFn = common.logger.getLogFn; 
    var log = getLogFn(controllerId); 

    var vm = this; 

    vm.title = 'Login'; 
    vm.credentials = { 
     username: '', 
     password: '' 
    }; 
    vm.hideError = true; 
    vm.errorMessage = 'xx.'; 

    vm.login = function login() { 
     vm.hideError = true; 
     common.$broadcast(config.events.spinnerToggle, { show: true }); 
     common.user.authenticate(vm.credentials.username, vm.credentials.password, onSuccessfullLogin, onFailedLogin); 
    }; 
... 
function onFailedLogin(error) { 
     common.$broadcast(config.events.spinnerToggle, { show: false }); 
     console.log('error ' + error); 
     vm.hideError = false; 
    } 
... 

Любые идеи относительно того, что происходит или как я могу узнать, что происходит? Спасибо за ваше время!

ОБНОВЛЕНИЕ Я не должен был слишком волноваться. После выполнения некоторых тестов в приложении я решил проверить отчеты. До этого все прекрасно работало. Когда я просмотрел отчет, я получил следующую ошибку:

The model backing the 'BabDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database

В отчетах используется SSRS. Если я запустил скрипт для создания столбца И обновил таблицу _Migrations, я не понимаю, почему я получаю эту ошибку. Трассировка стека указывает на последнюю строку. Я читал предложения, но там, где мне нужно добавить код в метод OnModelCreating, но я не уверен, что это путь. Были другие развертывания, сделанные другими до меня, поэтому я чего-то не хватает.

public class AbaDbContext : IdentityDbContext<User>, IDbContext 
{ 
    public const int UnknownCTId = 1; 
    private IEncryptionService _encryptionService; 
    private static Dictionary<Guid, string> _cipherCache = new Dictionary<Guid,string>(); 

    public BabDbContext() 
     : base("BabDbContext") 
    { 
     ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += new ObjectMaterializedEventHandler(ObjectMaterialized); 

ответ

1

Похоже, ваш контекст пытается запустить миграции на сервере и происходит сбой из-за нехватки разрешений либо или что Deleted столбец уже существует. Ваши варианты:

  1. Выполнение производственных миграций путем создания сценария. Вы можете сделать это, выполнив следующую команду:

    Update-Database -Script 
    

    Это создаст SQL скрипт, который ЮО может работать с базой данных, чтобы создать столбец и, критически, вставить строку в __MigrationHistory таблицу, которая говорит EF, что оно не требуется снова выполнять миграции.

  2. Создайте инициализатор контекста, который эффективно отключает миграцию. Добавьте класс, который наследуется от NullDatabaseInitializer<T>:

    public class DisableMigrations : NullDatabaseInitializer<YourContext> 
    { 
    } 
    

    И в вашей продукции web.config:

    <entityFramework> 
        <contexts> 
        <context type="YourNamespace.Domain.YourContext, YourNamespace.Domain"> 
         <databaseInitializer 
           type="YourNamespace.Domain.DisableMigrations, YourNamespace.Domain"/> 
        </context> 
        </contexts> 
    </entityFramework> 
    
+0

ЧТО СДЕЛАЛИ ЭТО! Я использовал эту команду для генерации скрипта, но я только захватил часть, которая добавила столбец «Удалено». Я восстановил резервную копию базы данных и на этот раз взял весь сгенерированный скрипт, и это сработало. БОЛЬШОЕ СПАСИБО! – rsford31

+0

Рад, что это сработало. Большинство людей не понимают, что таблица миграции фактически содержит всю модель EDMX, и если она не соответствует тому, что EF внутренне, она снова запускает миграцию. – DavidG

+0

Я не должен был волноваться. Я обновил свой первоначальный вопрос. Я добавил это в файл gobal.asax.cs в проекте Reportviewer: 'Database.SetInitializer (null);'. Я не понимаю, почему я должен был это делать, когда это не нужно делать предыдущим разработчикам, вносящим изменения? – rsford31