2016-02-26 37 views
2

我的連接字符串如下:使用1個連接字符串ASP.NET實體和身份都

<connectionStrings> 
<add name="InventoryContext" connectionString="metadata=res://*/Database.InventoryModel.csdl|res://*/Database.InventoryModel.ssdl|res://*/Database.InventoryModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=CCS-6YZ8F72\CONQUESTDB;initial catalog=ConquestDB;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
<add name="InventoryContextIdentity" providerName="System.Data.SqlClient" connectionString="Data Source=CCS-6YZ8F72\CONQUESTDB;Initial Catalog=ConquestDB;Integrated Security=True;MultipleActiveResultSets=True;Application name=EntityFramework;" /> 
</connectionStrings> 

對於實體我有以下幾點:

namespace ConquestInventory.Database 
{ 
    using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 

    public partial class InventoryContext : DbContext 
    { 
     public InventoryContext() 
      : base("name=InventoryContext") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public virtual DbSet<C__MigrationHistory> C__MigrationHistory { get; set; } 
     public virtual DbSet<AspNetRole> AspNetRoles { get; set; } 
     public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; } 
     public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; } 
     public virtual DbSet<AspNetUserRole> AspNetUserRoles { get; set; } 
     public virtual DbSet<AspNetUser> AspNetUsers { get; set; } 
     public virtual DbSet<Table_Asset_Cert> Table_Asset_Cert { get; set; } 
     public virtual DbSet<Table_Asset_Info> Table_Asset_Info { get; set; } 
     public virtual DbSet<Table_Asset_Part> Table_Asset_Part { get; set; } 
    } 
} 

與身份,我有以下:

namespace ConquestInventory.Models 
{ 
    public class MyIdentityDbContext : IdentityDbContext<MyIdentityUser> 
    { 
     public MyIdentityDbContext() : base("name=InventoryContextIdentity", throwIfV1Schema: false) 
     { 

     } 

     public static MyIdentityDbContext Create() 
     { 
      return new MyIdentityDbContext(); 
     } 
    } 

    public class MyIdentityUser : IdentityUser 
    { 
     public string FullName { get; set; } 
    } 

    public class MyIdentityRole : IdentityRole 
    { 
     public MyIdentityRole() 
     { 

     } 

     public MyIdentityRole(string roleName, string description) : base (roleName) 
     { 
      this.Description = description; 
     } 

     public string Description { get; set; } 
    } 
} 

這工作得很好。我不喜歡的是InventoryContext和InventoryContextIdentity都指向同一個數據庫。第一個是System.Data.EntityClient,第二個是System.Data.SqlClient。

現在,如果我刪除InventoryContextIdentity併爲兩者使用InventoryContext,身份登錄/註冊將不起作用,說MyIdentityUser在此模型中不可用。反之亦然,如果我刪除InventoryContext,它說我必須使用System.Data.EntityClient進行實體數據庫調用,以完成其餘的代碼。

我可以讓它這樣,但想知道是否有一種簡單的方法只有一個連接字符串。當我將它放在服務器上並且必須連接到數據庫時,這會成爲問題嗎?我需要連接兩次嗎?

+0

無論如何,即使您使用單個連接字符串,您也必須多次連接它。 – mason

+0

當你通過EF連接到sql服務器時,連接字符串格式完全不同,並且在配置文件中不應該有兩個連接字符串。我已經看到項目中有4個不同的數據庫連接字符串3服務器System.Data.SqlClient和1爲System.Data.EntityClient。也許你可以閱讀關於差異的'msdn'文檔 – MethodMan

+0

爲什麼不做明顯的並且有單個上下文?讓您的InventoryContext繼承身份上下文。 http://odetocode.com/blogs/scott/archive/2014/01/03/asp-net-identity-with-the-entity-framework.aspx –

回答

1

是的,你可以只使用一個連接字符串,但是你將需要在每個實例上手動向DBContext傳遞連接字符串。

一個好主意,可以在你的主類的靜態構造函數或配置類來創建連接字符串,然後在任何地方使用它:

public static class MyConfig 
{ 
    public static string ECS; 

    static MyConfig() 
    { 
     string srcConnectionString = System.Configuration.ConfigurationManager. 
      ConnectionStrings["connectionStringName"].ConnectionString; 

     EntityConnectionStringBuilder sb = new EntityConnectionStringBuilder(srcConnectionString); 

     ECS = sb.ToString(); 
    } 
} 

然後,當你需要使用的DbContext你實例化這樣的:

MyDBContext context = new MyDBContext(MyConfig.ECS); 

無論如何,EF會管理它自己的連接,你沒有連接的生命週期的完全控制,因爲他們正在彙集,再利用,並通過除非你內部政策銷燬使用Connection.Open()和Connection.Close( )在上下文中的功能(這從來不是一個好主意)。