ASP.Net MVC 5不起作用数据库第一种方法
我正在用Entity Framework 6开发Asp.Net MVC 5应用程序。我使用的是DatabaseFirst方法,我想用标准Microsoft.AspNet.Identity
库进行用户身份验证。ASP.Net MVC 5不起作用数据库第一种方法
1)。我创建了Asp.Net MVC 5项目。 2)。将DefaultConnection更改为我的本地SQL服务器。 3)。运行应用程序以在服务器上生成数据库。 4)。在这个新的数据库中添加了我的新表。 5)。从数据库生成模型。
当我想从我的表得到一些数据,我收到一条错误消息:
// GET: Tests
public ActionResult Index()
{
return View(_repository.GetAllTests());
}
上下文是在代码优先模式下的代码是从一个EDMX文件生成使用数据库优先或模型优先开发。这将无法正常工作。要解决此问题,请不要删除引发此异常的代码行。如果您希望使用Database First或Model First,请确保实体框架连接字符串包含在启动项目的app.config或web.config中。如果您正在创建自己的DbConnection,那么请确保它是一个EntityConnection而不是其他类型的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用于ApplicationUser。检查该DbContext的连接字符串。
这可能会帮助:Entity Framework 6 and Asp.Net Identity UserManager: Multiple DbContext
更新的主题。是的,我有两个上下文。 – Oblomingo 2014-12-04 14:04:49
你将不得不继承IdentityDbContext上下文类。要做到这一点,你将不得不改变T4模板文件...
- 打开Entities.tt文件
-
导航到该行...
<#= Accessibility.ForType(容器)#>部分类的实体:的DbContext
,并将其更新至
<#=Accessibility.ForType(container)#> partial class Entities : IdentityDbContext<ApplicationUser>
-
保存文件并检查生成的上下文类。它应该是...
公共部分类实体:IdentityDbContext < ApplicationUser> { 公共实体() :基地( “NAME =实体”) {}
不,它不起作用。相同的错误消息 - 实体类型ApplicationUser不是当前上下文的模型的一部分。 – Oblomingo 2014-12-04 14:38:17
尝试更改t4模板中的“:base(”name = Entities“)”Line to“:base(”Entities“,throwIfV1Schema:false)” – Teddy 2014-12-04 14:42:51
我认为,我必须使用两个连接字符串 - 一个用于身份providerName =“System.Data.SqlClient”,一个用于我的表与providerName =“System.Data.EntityClient”。现在它正在工作。 – Oblomingo 2014-12-04 14:57:11
这可能会有帮助。 http://stackoverflow.com/questions/23893710/the-entity-type-applicationuser-is-not-part-of-the-model-for-the-current-context – 2o3y 2014-12-04 13:40:43