2014-12-04 64 views
1

我正在用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=&quot; 
    data source=.\SQL2012; 
    initial catalog=ETests; 
    integrated security=True; 
    MultipleActiveResultSets=True; 
    App=EntityFramework&quot;" 
    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; } 
} 
+0

這可能會有幫助。 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

回答

-1

你將不得不繼承IdentityDbContext上下文類。要做到這一點,你將不得不改變T4模板文件...

  1. 打開Entities.tt文件
  2. 導航到該行...

    <#= Accessibility.ForType(容器)#>部分類的實體:的DbContext

,並將其更新至

<#=Accessibility.ForType(container)#> partial class Entities : IdentityDbContext<ApplicationUser> 
  • 保存文件並檢查生成的上下文類。它應該是...

    公共部分類實體:IdentityDbContext < ApplicationUser> { 公共實體() :基地( 「NAME =實體」) {}

  • +0

    不,它不起作用。相同的錯誤消息 - 實體類型ApplicationUser不是當前上下文的模型的一部分。 – Oblomingo 2014-12-04 14:38:17

    +0

    嘗試更改t4模板中的「:base(」name = Entities「)」Line to「:base(」Entities「,throwIfV1Schema:false)」 – Teddy 2014-12-04 14:42:51

    +0

    我認爲,我必須使用兩個連接字符串 - 一個用於身份providerName =「System.Data.SqlClient」,一個用於我的表與providerName =「System.Data.EntityClient」。現在它正在工作。 – Oblomingo 2014-12-04 14:57:11