为 ASP.NET 实体和身份使用 1 个连接字符串
Using 1 connection string for both ASP.NET Entity and Identity
我的连接字符串如下:
<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="data source=CCS-6YZ8F72\CONQUESTDB;initial catalog=ConquestDB;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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 用于两者,身份 login/register 将不起作用,表示 MyIdentityUser 在此模型中不可用。反之亦然,如果我删除 InventoryContext,它会说我必须使用 System.Data.EntityClient 来调用其余代码的实体数据库。
我可以这样保留它,但想知道是否有一种简单的方法可以只使用一个连接字符串。当我把它放在服务器上并且必须连接到数据库时,这会不会有问题,我必须连接两次吗?
是的,您可以只使用一个连接字符串,但是您需要在每次实例化时手动将连接字符串传递给 DBContext。
一个好主意是在主 class 或配置 class 的静态构造函数中创建连接字符串,然后在任何地方使用它:
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() 在上下文中起作用(这绝不是一个好主意)。
我的连接字符串如下:
<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="data source=CCS-6YZ8F72\CONQUESTDB;initial catalog=ConquestDB;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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 用于两者,身份 login/register 将不起作用,表示 MyIdentityUser 在此模型中不可用。反之亦然,如果我删除 InventoryContext,它会说我必须使用 System.Data.EntityClient 来调用其余代码的实体数据库。
我可以这样保留它,但想知道是否有一种简单的方法可以只使用一个连接字符串。当我把它放在服务器上并且必须连接到数据库时,这会不会有问题,我必须连接两次吗?
是的,您可以只使用一个连接字符串,但是您需要在每次实例化时手动将连接字符串传递给 DBContext。
一个好主意是在主 class 或配置 class 的静态构造函数中创建连接字符串,然后在任何地方使用它:
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() 在上下文中起作用(这绝不是一个好主意)。