我正在开发一个使用ASP.Net Identity进行登录的MVC站点。
有一个用户表,其中pk是另一个表的FK(表2)。因此,用户无法删除。同样,还有从表2生成的报告。只要生成数据的用户名,此报告就会显示表2中的数据。不应该删除用户信息的另一个原因。
因此,我认为不会删除用户,而是在名为“已删除”的用户表中添加一列。它使用位数据类型。
使用代码优先迁移将该列添加到我的本地数据库副本中。当用户登录时,检查此列中的该值是否已选中(0 =未删除; 1 =已删除)。
一切都在我的本地机器上运行良好。我没有错误,代码运行正常。我能够与任何用户登录。然后,我部署到我们的测试服务器,并使用脚本将“已删除”列添加到测试SQL服务器上的表中。
当我和任何用户一起登录时,我无法登录。我一直收到“登录时出错。请重新输入凭据并重试”,即使我的凭据是正确的。
我删除了服务器上的文件并再次部署。同样的事情。
我退出了所有更改并再次部署,并且能够登录。 所以,我开始一次添加一件东西:
尝试登录并失败
删除了已删除的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);
答案 0 :(得分:1)
看起来您的上下文正在尝试在生产服务器上运行迁移,并且由于权限不足或Deleted
列已存在而失败。您的选择是:
通过创建脚本来运行生产迁移。您可以通过运行以下命令来执行此操作:
Update-Database -Script
这将创建一个SQL脚本,yuo可以针对您的数据库运行以创建列,并且严格地在__MigrationHistory
表中插入一行,告诉EF它不需要再次运行迁移
创建有效禁用迁移的上下文初始化程序。添加一个继承自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>