2015-10-20 96 views
0

我正在使用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); 

回答

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

THAT做到了!我確實使用該命令來生成腳本,但我只抓取添加了「已刪除」列的部分。我恢復了數據庫的備份副本,並且這次使用了整個生成的腳本,並且它工作正常。非常感謝! – rsford31

+0

很高興工作。大多數人並沒有意識到遷移表實際上保存了整個EDMX模型,並且如果它與EF內部不匹配,它將再次運行遷移。 – DavidG

+0

雖然我不應該激動。我更新了我原來的問題。我最終將其添加到Reportviewer項目中的gobal.asax.cs文件中:'Database.SetInitializer (null);'。我不明白爲什麼我不得不這樣做,因爲以前的開發人員不需要做任何更改就可以做到這一點。 – rsford31