我正在尝试使用此链接中的方法将Identity模型移动到类库中:
问题1:似乎继续使用Website项目的连接字符串。我通过在类库中指定完整的连接字符串来克服它。我可以让IdentityDbContext使用类库的连接字符串吗?
问题2:由于问题1,如果我从网站项目中删除实体框架。它会在网站项目中寻找EF的SqlClient时出现以下错误。
EntityFramework.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理
其他信息:找不到具有不变名称“System.Data.SqlClient”的ADO.NET提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分中注册。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。
欢迎使用其他解决方案,只要它在网站项目中省略所有数据访问层引用,如EF。
答案 0 :(得分:66)
要将IdentityModel移动到类库(根据SRP这是正确的事情),请按照下列步骤操作:
使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 ...
}
当您网站中的任何人尝试登录或注册时,身份系统会使用所有您的数据(包括身份表)将其路由到您的数据库。
很高兴去!
答案 1 :(得分:7)
更新@ Rap的EF6和Identity 2.0答案:
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 ...
}
答案 2 :(得分:1)
将Identity转移到类库中是什么意思?用作参考?我将自定义用户管理器和用户放在一个单独的库中,但这就是全部。
标识内容需要某种数据存储。如果您将Identity配置为使用EF,请确保为其获取其他nuget包,并且您应该能够在创建上下文时传递连接字符串。
脱离我的头顶......
var mgr = new UserManager<ApplicationUser>(
new IUserStore_ofYourChoice<ApplicationUser>(
new DbContextName("ConnectionStringOverload"));
我认为EF商店是&#34; UserStore&#34;,需要验证。
现在有几十种不同的nuget包用于Identity的数据存储。你不必使用EF,但它需要某种商店。
**编辑**
此外,作为参考,它将始终使用主要项目的配置,因此它定义的连接字符串,这就是它的假设是如何工作的,所以没关系。
答案 3 :(得分:1)
你必须认识并记住一些规则。
首先,Web项目将始终只使用它在自己的项目中找到的web.config文件。在解决方案的任何其他地方放置任何其他配置文件并不重要。 Web项目只能使用它在自己的项目中找到的内容。如果在另一个项目中有连接字符串,则必须将其复制到Web项目,否则永远不会找到它。
其次,假设Web项目是您的启动项目,并假设您正在使用数据迁移(因为Identity使用它),请注意包管理器将始终使用它在启动项目中找到的连接字符串。因此,update-database的包管理器将不使用模型项目中的连接字符串。
简单的解决方案是: 1.将连接字符串从模型项目复制到Web项目。 2.在包管理器控制台中,确保选择上下文的下拉列表指向您的模型项目。
答案 4 :(得分:0)
问题1: -
我猜可以使用以下链接中找到的解决方案: -
Setup Entity Framework For Dynamic Connection String
问题2: -
我相信实体框架构建了当执行时间将使用该项目的web.config时的方式。微软的指示也建议
http://msdn.microsoft.com/en-us/library/vstudio/cc716677(v=vs.100).aspx
答案 5 :(得分:-1)
我想我参加聚会有点晚了,但是对于未来的读者来说,here's很不错。