为ASP.NET实体和标识使用1个连接字符串

时间:2016-02-26 15:41:00

标签: 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 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进行实体数据库调用以获取我的其余代码。

我可以这样离开,但想知道是否只有一个连接字符串的简单方法。当我把它放在服务器上并且必须连接到数据库时,这是一个问题,我是否必须连接两次?

1 个答案:

答案 0 :(得分: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()函数在上下文中(这绝不是一个好主意)。