我正在使用ASP.Net身份登錄的MVC網站。MVC Asp.NET身份未知錯誤發生
有一個用戶表,其中pk是另一個表(表2)的FK。因此,用戶不能被刪除。同樣,還有從表2生成的報告。此報告顯示來自表2的數據,只要生成數據的用戶名即可。不應該刪除用戶信息的另一個原因。
因此,而不是刪除用戶,我想我會添加一列到名爲「已刪除」的用戶表。它使用了一點數據類型。
使用代碼優先遷移將列添加到我的本地數據庫副本。當用戶登錄時,在此列中檢查此值被選中(0 =未刪除; 1 =已刪除)。
一切工作在我的本地機器很好。我沒有錯誤,代碼運行良好。我能夠與任何用戶登錄。然後,我部署到我們的測試服務器,並使用腳本將「已刪除」列添加到測試SQL服務器上的表中。
當我去用任何用戶登錄時,我無法登錄。我不斷收到「錯誤登錄,請重新輸入憑據並再次嘗試」,即使我的憑據是正確的。
我刪除了服務器上的文件並再次部署。一樣。
我退出了我所有的變化和再部署,並能夠登錄 於是,我開始一次添加的東西一件:
- 我跑的腳本添加刪除柱一個位數據類型,並設置 爲NOT NULL我們的測試SQL服務器
- 測試記錄上,並能
- 增加公共BOOL刪除{獲得;設置;}我的BL實體並將其部署到 測試
嘗試登錄和失敗
刪除了已刪除的布爾和重新部署
能夠登錄在
我不明白爲什麼這個增加導致問題。 「已刪除」列在應用程序的其他表中使用,並沒有引起任何問題。而且因爲當我在本地運行它時工作正常,所以我很難確定問題所在。
這裏是我的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;
}
...
任何關於正在發生的事情或我如何能夠找出發生的事情的想法?謝謝你的時間!
UPDATE 我不應該太激動。在應用程序中執行了一些測試後,我想我會測試這些報告。到目前爲止,一切都很好。當我查看報告時,我收到以下錯誤:
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);
THAT做到了!我確實使用該命令來生成腳本,但我只抓取添加了「已刪除」列的部分。我恢復了數據庫的備份副本,並且這次使用了整個生成的腳本,並且它工作正常。非常感謝! – rsford31
很高興工作。大多數人並沒有意識到遷移表實際上保存了整個EDMX模型,並且如果它與EF內部不匹配,它將再次運行遷移。 – DavidG
雖然我不應該激動。我更新了我原來的問題。我最終將其添加到Reportviewer項目中的gobal.asax.cs文件中:'Database.SetInitializer(null);'。我不明白爲什麼我不得不這樣做,因爲以前的開發人員不需要做任何更改就可以做到這一點。 –
rsford31