2015-02-11 158 views
0

這個問題有關SQL Server「3xpr355」(混淆 引號是由設計;它應防止以後的搜索創下 死衚衕,正如我所做的那樣)。代碼優先MVC 4使用實體框架和SQL Server 2012


我使用代碼優先和Entity Framework開發一個MVC 4應用程序。 SQL Server,IIS和Visual Studio都在同一臺機器上運行。

我最初使用的是SQL Server「3xpr355」,但要求將它放在暴露於互聯網的ISS機器上,使它能夠連接到一個功能齊全的SQL Server。我已經設置了刪除並重新創建數據庫的應用程序每當模型更改:

public class XyzDBContext : DbContext 
{ 
    public XyzDBContext() 
     : base("XyzDBContext") 
    { 
     Database.SetInitializer<XyzDBContext>(new DropCreateDatabaseIfModelChanges<XyzDBContext>()); 
    } 

    public DbSet<XyzModel> XyzModels{ get; set; } 
} 

這裏是我的連接字符串:

<connectionStrings> 
<add 
    name="DefaultConnection" 
    connectionString="Data Source=.;Initial Catalog=aspnet-Xyz-20150131102119;Integrated Security=SSPI" 
    providerName="System.Data.SqlClient" /> 
<add 
    name="XyzDBContext" 
    connectionString="Data Source=.;Initial Catalog=XyzDatabase;Integrated Security=True" 
    providerName="System.Data.SqlClient"/> 
</connectionStrings> 

期望:

  • 執行使用XyzDBContext的應用程序部分應導致創建數據庫「XyzDatabase」(如有必要)。
  • 執行使用成員資格提供程序的應用程序部分應導致創建數據庫「aspnet-Xyz-20150131102119」(如有必要)。

實際結果:

  • 拋出異常:當從數據庫中獲取信息提供商System.Data.ProviderIncompatibleException「發生 錯誤 這可以通過實體框架使用了不正確造成的。連接 string。檢查內部例外的詳細信息並確保 連接字符串是正確的。「
  • 內部異常: System.Data.ProviderIncompatibleException「提供者沒有 返回一個ProviderManifestToken字符串。」
  • 內部異常: System.Data.SqlClient.SqlException「用戶登錄失敗 'DOMAIN \ SERVER $'。」

措施:

  • 我一直在使用SQL Server Management Studio中添加一個登錄 「域\服務器$」 用戶嘗試,但登錄總是失敗。
  • 我已經研究並嘗試了很多連接字符串的排列,除了我發現的幾個例子都用於SQL Server「3xpr355」之外。

回答

0

這個問題的解決辦法是多方面的:

創建一個應用程序池

在IIS管理器中,訪問「應用程序池」節點並選擇「添加應用程序池...」操作: Creating the application pool

選擇新的應用程序池並選擇「高級設置...」操作,然後選擇「...」 按鈕(在 「標識」 字段): Changing the application pool identity

設置應用程序池標識爲 「本地系統」

Setting the identity to LocalSystem

授予許可

在SQL Server Management Studio中(連接到數據庫服務時),訪問「登錄」下的「NT AUTHORITY \ SYSTEM」節點並打開「屬性」視圖,然後選擇「服務器角色「頁面,並通過選擇複選框授予所有權限: Granting all privileges

在IIS管理器中,右鍵單擊您的站點並選擇」管理應用程序/高級設置...「並設置」應用程序池「屬性值改爲」CodeFirstMVC「。

運行應用程序

運行應用程序,並參觀這將需要一個新的數據庫中創建的領域;你現在應該在你的SQL Server實例上看到一個新的數據庫。

+0

這是我的答案!很高興我能幫上忙 – Fourat 2015-02-12 16:43:15

1

那麼,如果你將每個連接字符串(數據庫)映射到它自己的DbContext,你可以達到你的期望,但你仍然需要處理兩個上下文(這是痛苦的)。
您的第三個實際結果是由於IIS無法連接到數據庫。你必須去到IIS管理器和更改應用程序池下,你的應用程序運行(您可以將其更改爲本地系統)的身份
最後,試試這個,如果你已經創建了數據庫:

public class DefaultConnectionContext : DbContext, IDisposable 
    { 
     public DefaultConnectionContext() 
      : base("name=DefaultConnection") 
     { 
      Database.SetInitializer<DefaultConnectionContext>(null); 
     } 

     // Some dbsets 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
     } 
    } 

public class XyzDBContext : DbContext, IDisposable 
    { 
     public XyzDBContext() 
      : base("name=XyzDBContext") 
     { 
      Database.SetInitializer<XyzDBContext>(null); 
     } 

     // Some dbsets 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
     } 
    } 

希望這有助於

+0

感謝您的應用程序池的建議;它並沒有開箱即用,但它使我的努力朝着一個新的方向發展。請從您的答案中刪除未被模糊處理的「3xpr355」,並將其投票選爲有幫助的。 – 2015-02-12 15:51:30

+1

很高興我可以提供幫助,幾周前我遇到了同樣的問題,並且更改應用程序池的身份解決了它,下面介紹如何執行此操作:https://technet.microsoft.com/en-us/library/cc771170%28v=ws .10%29.aspx – Fourat 2015-02-12 15:58:31