ASP.Net MVC 5 数据库优先方法不起作用
本文关键字:方法 不起作用 数据库 Net MVC ASP | 更新日期: 2023-09-27 18:33:16
我正在使用实体框架 6 开发 Asp.Net MVC 5 应用程序。我正在使用数据库优先方法,我想使用标准Microsoft.AspNet.Identity
库进行用户身份验证。
1(. 我已经创建了 Asp.Net MVC 5 项目。
2(. 更改了与本地 SQL 服务器的默认连接。
3(. 运行应用程序以在服务器上生成数据库。
4(. 在这个新数据库中添加了我的新表。
5(. 从数据库生成模型。
当我尝试从表中获取一些数据时,我收到一条错误消息:
// GET: Tests
public ActionResult Index()
{
return View(_repository.GetAllTests());
}
上下文在代码优先模式下使用从 EDMX 文件生成的代码,用于数据库优先或模型优先开发。 这将无法正常工作。若要解决此问题,请不要删除引发此异常的代码行。如果要使用"数据库优先"或"模型优先",请确保实体框架连接字符串包含在启动项目的 app.config 或 web.config 中。如果要创建自己的 DbConnection,请确保它是实体连接,而不是其他类型的 DbConnection,并将其传递给采用 DbConnection 的基本 DbContext 构造函数之一。若要了解有关代码优先、数据库优先和模型优先的详细信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715
好的,我将连接字符串从:
<add name="Entities" connectionString="Data Source=.'SQL2012;
Initial Catalog=ETests;
Integrated Security=True"
providerName="System.Data.SqlClient" />
自
<add name="Entities"
connectionString="metadata=res://*/Entities.csdl|
res://*/Entities.ssdl|
res://*/Entities.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=.'SQL2012;
initial catalog=ETests;
integrated security=True;
MultipleActiveResultSets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
现在,我可以从表中获取数据,但不能使用标准用户身份验证。我收到错误:
The entity type ApplicationUser is not part of the model for the current context.
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); // In this line
那么,我做错了什么?如何编写正确的连接字符串?
更新:我有标准的 DbContext:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("Entities", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
以及使用模型自动生成的上下文:
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<AspNetRole> AspNetRoles { get; set; }
public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; }
public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; }
public virtual DbSet<AspNetUser> AspNetUsers { get; set; }
public virtual DbSet<Document> Documents { get; set; }
public virtual DbSet<Image> Images { get; set; }
public virtual DbSet<Option> Options { get; set; }
public virtual DbSet<Paragraph> Paragraphs { get; set; }
public virtual DbSet<Question> Questions { get; set; }
public virtual DbSet<Section> Sections { get; set; }
public virtual DbSet<Test> Tests { get; set; }
}
您确定使用相同的上下文吗? 通常,UserManager 使用自己的 DbContext for ApplicationUser。 检查该数据库上下文的连接字符串。
这可能会有所帮助:实体框架 6 和 Asp.Net 标识用户管理器:多个数据库上下文
您必须从 IdentityDbContext 继承上下文类。为此,您必须更改 t4 模板文件...
- 打开 Entities.tt 文件
-
导航到该行...
<#> 分部类 实体 : DbContext
并将其更新为
<#=Accessibility.ForType(container)#> partial class Entities : IdentityDbContext<ApplicationUser>
保存文件并检查生成的上下文类。应该是...
public partial class Entities : IdentityDbContext
{公共实体((: base("名称=实体"({}