移动的ASP.. NET标识模型到类库



我正在尝试使用此链接中的方法将身份模型移动到类库:

ASP。. NET Identity in Services库

问题1:它似乎一直使用网站项目的连接字符串。我通过在类库中指定完整的连接字符串克服了这个问题。我可以使IdentityDbContext使用类库的连接字符串吗?

问题2:由于问题1,如果我从网站项目中删除实体框架。它将给出以下错误,它正在寻找EF的SqlClient在网站项目。

类型为'System '的异常。InvalidOperationException'在EntityFramework.dll中发生,但未在用户代码中处理

附加信息:没有为ADO找到实体框架提供程序。. NET提供程序具有不变名称'System.Data.SqlClient'。确保在应用程序配置文件的"entityFramework"部分中注册了提供程序。详见http://go.microsoft.com/fwlink/?LinkId=260882

其他解决方案是受欢迎的,只要它省略了所有的数据访问层引用,如EF在网站项目。

要将IdentityModel移动到类库中(根据SRP这是正确的事情),遵循以下步骤:

    创建一个类库。(ClassLibrary1)
  1. 使用NuGet,添加对microsoft . asp.net . identity . entityframework的引用。这也会自动添加一些其他引用。
  2. 在您的网站中添加ClassLibrary1的引用
  3. 找到WebSite/Models/IdentityModel.cs并移动到ClassLibrary1。
  4. 让IdentityModel.cs看起来像这样

    public class ApplicationUser : IdentityUser
    {
    }
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("YourContextName")
        {
        }
    }
    
  5. 确保您的网站的Web。config让YourContextName指向节中正确的数据库。(注意:这个数据库可以而且应该存放你的应用程序数据)。

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere"
      providerName="System.Data.SqlClient" />
    
  6. 让你的EF Context类继承你的ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

当任何人在您的站点尝试登录或注册时,身份系统会将他们路由到您的数据库,并使用所有您的数据,包括身份表。

好了!

@Rap对EF6和Identity 2.0答案的更新:

    创建一个类库。(ClassLibrary1)
  1. 使用NuGet,添加对Microsoft.AspNet.Identity.EntityFramework和Microsoft.AspNet.Identity.Owin的引用。
  2. 在您的网站中添加ClassLibrary1的引用
  3. 找到WebSite/Models/IdentityModel.cs并移动到ClassLibrary1。
  4. IdentityModel.cs应该是这样的,不需要改变任何东西:

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
            // Add custom user claims here
            return userIdentity;
        }
    }
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
    
  5. 确保您的网站的Web。Config有一个上下文指向节中的正确数据库。(注意:这个数据库可以而且应该存放你的应用程序数据)。

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  6. 让你的EF Context类继承你的ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

我想我有点晚了,但对于未来的读者,这里有一个很好的阅读。

将Identity移动到类库中是什么意思?作为参考?我在一个单独的库中有我的自定义用户管理器和用户,但仅此而已。

标识需要某种类型的数据存储。如果您将Identity配置为使用EF,请确保为它获取额外的nuget包,并且您应该能够在创建上下文时传递连接字符串。

Off the top of my head…

var mgr = new UserManager<ApplicationUser>(
     new IUserStore_ofYourChoice<ApplicationUser>(
       new DbContextName("ConnectionStringOverload"));

我认为EF商店是"UserStore",需要验证。

现在有近十二个不同的nuget包用于Identity的数据存储。您不必使用EF,但它需要某种类型的存储。

** EDIT **

此外,作为一个引用,它将始终使用配置,因此它定义的连接字符串,默认情况下主项目,这就是它应该如何工作,所以这是好的

有几条规则你必须知道并记住。

首先,Web项目将始终且仅使用Web。它在自己的项目周期中找到的配置文件。您在解决方案中的任何其他配置文件中放入的内容都无关紧要。web项目只能使用它在自己的项目中找到的内容。如果您在另一个项目中有一个连接字符串,您必须将其复制到web项目中,否则将永远找不到它。

第二,假设web项目是您的启动项目,并且假设您正在使用数据迁移(因为Identity使用它),请注意包管理器将始终使用它在启动项目中找到的连接字符串。因此,update-database的包管理器将不会在您的模型项目中使用连接字符串。

简单的解决方案是:1. 将连接字符串从模型项目复制到web项目。2. 在包管理器控制台中,确保选择上下文的下拉菜单指向您的模型项目。

问题1:-

我想可以使用下面链接中的解决方案:-

为动态连接字符串设置实体框架

问题2:-

我相信实体框架构建的方式,在执行的时候会用到web。该项目的配置。来自微软的说明也建议

http://msdn.microsoft.com/en-us/library/vstudio/cc716677 (v = vs.100) . aspx

相关内容

  • 没有找到相关文章

最新更新