2014-10-06 29 views
10

Tôi thấy cùng một vấn đề với câu hỏi this, nhưng kịch bản được trình bày dường như không áp dụng vì vậy tôi nghĩ rằng tôi có vấn đề khác. Trong thực tế, tôi thấy một số câu hỏi về SO tương tự nhau, mỗi câu hỏi với các nguyên nhân và giải pháp khác nhau, vì vậy tôi nghĩ rằng lỗi này phải được gây ra từ mức cao. Điều đó nói rằng ...Loại thực thể IdentityUser không phải là một phần của mô hình cho ngữ cảnh hiện tại

Tôi có một mô hình cơ sở dữ liệu mã đầu tiên của EF và tôi đang cố gắng sử dụng IdentityUser để mở rộng đăng ký chuẩn cho trang web MVC 5 của tôi.

Tôi có tôi mở rộng UserModel:

namespace MyMvcSite.Models { 
    public class UserModel :IdentityUser { 
     public string BillingId { get; set; } 
     public virtual ICollection<DatabaseModel> Databases { get; set; } 
} 

Và bối cảnh của tôi:

using MyMvcSite.Models; 
namespace MyMvcSite.Web { 
    public class AuthContext : IdentityDbContext<UserModel> { 
     public AuthContext() : base("AuthContext") { 

     } 
    } 
} 

Bây giờ, khi tôi thực thi mã đăng ký một user:

public async Task<IdentityResult> RegisterUser(UserModel user) { 
    user.Email = user.UserName; 
    var result = await _userManager.CreateAsync(user); 

    return result; 
} 

tôi nhận được lỗi: The entity type IdentityUser is not part of the model for the current context. Tôi không thể hiểu được lỗi này có nghĩa là gì, vì có vẻ - với tôi - l Tôi có mọi thứ chính xác. Bất cứ ai có thể nói những gì có thể sẽ sai?

Tôi biết kết nối của mìnhString AuthContext là chính xác vì trước đây tôi đã sử dụng nó.

+0

Làm thế nào để bạn nhanh chóng '_userManager' và nó' context' của bạn? Điều này có vẻ như nó có thể giúp: http://stackoverflow.com/questions/23893710/the-entity-type-applicationuser-is-not-part-of-the-model-for-the-current-context –

+0

My '_userManager 'đã được khởi tạo thành:' _userManager = new UserManager (new UserStore (_ ctx)); Tôi đã thay đổi nó thành '_userManager = new UserManager (new UserStore (_ctx));', đã giải quyết nó! Đăng câu trả lời này và tôi sẽ chấp nhận. Cám ơn đã chỉ tôi hướng đi đúng! – Brett

Trả lời

13

Khi bạn đang sử dụng một lớp người dùng tùy chỉnh với ASP.NET Identity, bạn phải chắc chắn rằng bạn chỉ định một cách rõ ràng cho người dùng tùy chỉnh lớp loại <T> cho cả UserManagerUserStore trên instantiation.

private UserManager<UserModel> _userManager; 

public AccountController() 
{ 
    AuthContext _ctx = new AuthContext(); 

    UserStore<UserModel> userStore = new UserStore<UserModel>(_ctx); 
    _userManager = new UserManager<UserModel>(userStore);  
} 

hoặc dưới hình thức ngắn hơn (như lời nhận xét trả lời của bạn):

private UserManager<UserModel> _userManager; 

public AccountController() 
{ 
    AuthContext _ctx = new AuthContext();  
    _userManager = new UserManager<UserModel>(new UserStore<UserModel>(_ctx));  
} 

Nếu loại được phép mặc định để IdentityUser khi bạn muốn sử dụng một lớp tùy chỉnh bạn sẽ được trải nghiệm các lỗi bạn báo cáo.

+0

Điều này đã làm được! Cảm ơn! – Brett

+0

Cảm ơn bạn, @Brett –

+0

+100 Đã hoạt động! –

5

Tôi gặp lỗi này khi tôi giới thiệu DI cho dự án của mình. Sử dụng AutoFac và Identity tôi đã có thêm những điều sau đây: builder.RegisterType<ApplicationDbContext>().As<DbContext>().InstancePerLifetimeScope();

Nếu không có này, khi AutoFac được tạo ra Ví dụ UserStore của tôi, nó đã được sử dụng ctor mặc định UserStore() mà tạo ra một mới IdentityDbContext, không ApplicationDbContext tôi.

Với dòng này, UserStore(DbContext context) ctor được gọi, với số ApplicationDbContext.

7

Tôi đã gặp sự cố tương tự này và tôi nhớ lại có sự cố tương tự khi làm việc với SimpleMembership trong MVC4.

Tôi đang phát triển cơ sở dữ liệu đầu tiên, vì vậy tôi có tệp EDMX. Hóa ra, ASP.NET Identity không thích chuỗi kết nối được tạo ra khi bạn tạo tệp mô hình .edmx của mình. Nếu bạn đang sử dụng a. Chuỗi kết nối EDM trong: base (“EDMConnString”) bạn rất có thể sẽ gặp phải vấn đề này.

Tôi đã sửa lỗi này bằng cách tạo chuỗi kết nối tiêu chuẩn trỏ đến cơ sở dữ liệu nơi bảng ASP.NET Identity (trong trường hợp của tôi cùng cơ sở dữ liệu), đã sử dụng chuỗi kết nối đó trong: base và nó hoạt động.

Something như thế này

<add name="IdentityConnection" connectionString="data source=THEJUS\SQLSERVER2014;initial catalog=IdentitySample;integrated security=True;MultipleActiveResultSets=True;App=IdentitySample.Admin" providerName="System.Data.SqlClient" /> 
+3

Có. Điều đó đã giải quyết được vấn đề của tôi. Có 2 chuỗi kết nối cần thiết. Một cho công cụ Identity và một cho EF. Nếu bạn nhìn vào Web.Config bạn sẽ thấy một kết nối mặc định và sau đó một EF tạo ra khi bạn cấu hình nó trong khi cài đặt nó. Bạn có thể dễ dàng xây dựng một MVC5 giả và thêm EF để xem chúng và sử dụng chúng nếu cơ sở dữ liệu của bạn giống nhau. Vấn đề của tôi là do ứng dụng MVC 5 mà tôi đã thêm EF sau này (Dữ liệu đầu tiên bằng cách này). Sau đó, tôi đã xóa suy nghĩ "DefaultConnection", tôi không cần nó. Vì vậy, Identity sử dụng kết nối được tham chiếu trong cơ sở. EF sử dụng bất kỳ mô hình thực thể nào bạn đặt ở đầu bộ điều khiển. – JustJohn

+0

MyModelEntities _db = new MyModelEntities(); – JustJohn

+1

Cảm ơn bạn @JustJohn, đây là CUỐI CÙNG những gì đã làm việc cho tôi! – GabeMeister

Các vấn đề liên quan