我正在尝试使用此链接中的方法将身份模型移动到类库:
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)
- 使用NuGet,添加对microsoft . asp.net . identity . entityframework的引用。这也会自动添加一些其他引用。
- 在您的网站中添加ClassLibrary1的引用
- 找到WebSite/Models/IdentityModel.cs并移动到ClassLibrary1。
让IdentityModel.cs看起来像这样
public class ApplicationUser : IdentityUser { } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("YourContextName") { } }
确保您的网站的Web。config让YourContextName指向节中正确的数据库。(注意:这个数据库可以而且应该存放你的应用程序数据)。
<add name="YourContextName" connectionString="YourConnectionStringGoesHere" providerName="System.Data.SqlClient" />
让你的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)
- 使用NuGet,添加对Microsoft.AspNet.Identity.EntityFramework和Microsoft.AspNet.Identity.Owin的引用。
- 在您的网站中添加ClassLibrary1的引用
- 找到WebSite/Models/IdentityModel.cs并移动到ClassLibrary1。
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(); } }
确保您的网站的Web。Config有一个上下文指向节中的正确数据库。(注意:这个数据库可以而且应该存放你的应用程序数据)。
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" /> </connectionStrings>
让你的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. 在包管理器控制台中,确保选择上下文的下拉菜单指向您的模型项目。
我想可以使用下面链接中的解决方案:-
为动态连接字符串设置实体框架
问题2:-
我相信实体框架构建的方式,在执行的时候会用到web。该项目的配置。来自微软的说明也建议
http://msdn.microsoft.com/en-us/library/vstudio/cc716677 (v = vs.100) . aspx