C# 为ASP.NET实体和标识使用1个连接字符串
我的连接字符串如下所示:C# 为ASP.NET实体和标识使用1个连接字符串,c#,asp.net,entity-framework,asp.net-identity,C#,Asp.net,Entity Framework,Asp.net Identity,我的连接字符串如下所示: <connectionStrings> <add name="InventoryContext" connectionString="metadata=res://*/Database.InventoryModel.csdl|res://*/Database.InventoryModel.ssdl|res://*/Database.InventoryModel.msl;provider=System.Data.SqlClient;provider co
<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; }
}
}
namespace ConquestInventory.Database
{
使用制度;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
公共部分类InventoryContext:DbContext
{
公共目录上下文()
:base(“name=InventoryContext”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集C__迁移历史{get;set;}
公共虚拟数据库集AspNetRoles{get;set;}
公共虚拟DbSet AspNetUserClaims{get;set;}
公共虚拟数据库集AspNetUserLogins{get;set;}
公共虚拟数据库集AspNetUserRoles{get;set;}
公共虚拟数据库集AspNetUsers{get;set;}
公共虚拟数据库集表\u资产\u证书{get;set;}
公共虚拟数据库集表\u资产\u信息{get;set;}
公共虚拟数据库集表\u资产\u部分{get;set;}
}
}
至于身份,我有以下几点:
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; }
}
}
namespace ConquestInventory.Models
{
公共类MyIdentityDbContext:IdentityDbContext
{
public MyIdentityDbContext():base(“name=InventoryContextIdentity”,throwifvv1schema:false)
{
}
公共静态MyIdentityDbContext Create()
{
返回新的MyIdentityDbContext();
}
}
公共类MyIdentityUser:IdentityUser
{
公共字符串全名{get;set;}
}
公共类MyIdentityRole:IdentityRole
{
公共MyIdentityRole()
{
}
公共MyIdentityRole(字符串roleName,字符串描述):基(roleName)
{
这个。描述=描述;
}
公共字符串说明{get;set;}
}
}
这个很好用。我不喜欢的是InventoryContext和InventoryContextIdentity都指向同一个数据库。第一个是System.Data.EntityClient,第二个是System.Data.SqlClient
现在,如果我删除InventoryContextIdentity并同时使用InventoryContext,那么标识登录/注册将无法工作,因为MyIdentityUser在此模型中不可用。反之亦然,如果我删除InventoryContext,它会说我必须使用System.Data.EntityClient进行实体数据库调用,以完成其余代码
我可以这样离开它,但我想知道是否有一个简单的方法,只有一个连接字符串。当我将它放在服务器上并且必须连接到数据库时,这会是一个问题吗?我必须连接两次吗?是的,您可以只使用一个连接字符串,但是您需要在每次实例化时手动将连接字符串传递给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()函数(这从来都不是一个好主意).即使使用单个连接字符串,您也必须多次连接到它。当您通过
EF
连接到sql server时,连接字符串格式完全不同,在配置文件中同时使用两个连接字符串应该不会有问题。。我见过有4个不同数据库连接字符串的项目,其中3个用于SQL server System.Data.SqlClient,1个用于System.Data.EntityClient。也许您可以阅读有关差异的msdn
文档为什么不做显而易见的事情,并有一个单一的上下文?让您的InventoryContext继承标识上下文。