发生MVC Asp.NET身份未知错误

时间:2015-10-20 15:30:47

标签: asp.net-mvc asp.net-identity

我正在开发一个使用ASP.Net Identity进行登录的MVC站点。

有一个用户表,其中pk是另一个表的FK(表2)。因此,用户无法删除。同样,还有从表2生成的报告。只要生成数据的用户名,此报告就会显示表2中的数据。不应该删除用户信息的另一个原因。

因此,我认为不会删除用户,而是在名为“已删除”的用户表中添加一列。它使用位数据类型。

使用代码优先迁移将该列添加到我的本地数据库副本中。当用户登录时,检查此列中的该值是否已选中(0 =未删除; 1 =已删除)。

一切都在我的本地机器上运行良好。我没有错误,代码运行正常。我能够与任何用户登录。然后,我部署到我们的测试服务器,并使用脚本将“已删除”列添加到测试SQL服务器上的表中。

当我和任何用户一起登录时,我无法登录。我一直收到“登录时出错。请重新输入凭据并重试”,即使我的凭据是正确的。

我删除了服务器上的文件并再次部署。同样的事情。

我退出了所有更改并再次部署,并且能够登录。 所以,我开始一次添加一件东西:

  • 我运行脚本添加一个带有位数据类型并设置的Deleted列 在我们的测试SQL服务器上不为null
  • 测试登录并且能够
  • 添加公共布尔删除{get; set;}到我的BL实体并部署到 测试
  • 尝试登录并失败

  • 删除了已删除的bool并重新部署了

  • 能够登录

我不明白为什么这个添加会导致问题。 “已删除”列在应用程序的其他表中使用,并未导致任何问题。因为当我在本地运行时工作正常,我很难确定问题所在。

这是我的BL实体:

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;
    }
...  

有关正在发生的事情或如何了解发生了什么的任何想法?谢谢你的时间!

更新 我不应该太兴奋。在应用程序中执行一些测试后,我想我会测试报告。到那时为止,一切都很美好。当我查看报告时出现以下错误:

  

自创建数据库以来,支持'BabDbContext'上下文的模型已更改。考虑使用Code First Migrations来更新数据库

报告正在使用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 个答案:

答案 0 :(得分:1)

看起来您的上下文正在尝试在生产服务器上运行迁移,并且由于权限不足或Deleted列已存在而失败。您的选择是:

  1. 通过创建脚本来运行生产迁移。您可以通过运行以下命令来执行此操作:

    Update-Database -Script
    

    这将创建一个SQL脚本,yuo可以针对您的数据库运行以创建列,并且严格地在__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>