5

Giống như nhiều người khác, tôi đã cố gắng triển khai ASP.NET Identity Model First. Tất cả mọi thứ hoạt động tốt một khi bạn đã cố gắng, errored, fumed, tìm kiếm và giải quyết .. Tôi nghĩ.ASP.NET Identity Model Đầu tiên không thành công vì đổi tên thành cột AspNetUserRoles

Xem thêm:

khóa học của hành động, tóm tắt:

  • dự án mặc định Created (MVC5)
  • Tạo cơ sở dữ liệu
  • Cập nhật ConnectionString trong web.config
  • Run trang web, đăng ký: bảng được tạo ra
  • Tạo EF Model (edmx)
  • bảng nhập Identity (tất cả những gì tốt đẹp đến thời điểm này)
  • Modified xxx. Context.tt kế thừa từ IdentityDbContext
  • Tạo kịch bản cơ sở dữ liệu (rắc rối bắt đầu từ đây)

tôi đã giải quyết được vấn đề mà xuất hiện (lên đến bước gần nhất). Để hoàn thành, tôi sẽ mô tả chúng.

Sử dụng bối cảnh nhận dạng mặc định

Tất cả mọi thứ hoạt động tốt: bảng được tạo ra, tôi có thể đăng ký và đăng nhập. Tuy nhiên, đây không phải là tình huống mà tôi muốn: Tôi muốn sử dụng phương pháp Model First.

Sử dụng tùy chỉnh, mô hình bối cảnh đầu tiên sử dụng EF ConnectionString

Sửa đổi CreatePerOwinContext để nó sử dụng mẫu bối cảnh đầu tiên của tôi:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.CreatePerOwinContext(CustomModelFirstDbContext.Create); 

Và ApplicationUserManager để nó sử dụng mô hình đầu tiên ngữ cảnh:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
{ 
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<CustomModelFirstDbContext>())); 

Kết quả bằng:

Server Error in '/' Application.

The entity type ApplicationUser is not part of the model for the current context.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: The entity type ApplicationUser is not part of the model for the current context.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: [InvalidOperationException: The entity type ApplicationUser is not part of the model for the current context.]

Sử dụng "bình thường" ConnectionString với phong tục, Model bối cảnh đầu tiên

An exception of type 'System.Data.Entity.Infrastructure.UnintentionalCodeFirstException' occurred in WebApplication1.dll but was not handled in user code

Additional information: Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception.

Vì vậy, tôi figured tôi cần bối cảnh nhận dạng mặc định để sử dụng đặc tính, và sử dụng custom Model bối cảnh đầu tiên cho mọi thứ khác. Không phải là giải pháp ưu tiên, nhưng có thể chấp nhận được.

  • Rolled mọi thứ trở lại
  • bảng
  • nhập Sắc lấy cơ sở dữ liệu
  • (Không bắt buộc) các đơn vị tạo thông qua cách tiếp cận mô hình đầu tiên
  • tạo cơ sở dữ liệu kịch bản

Cả hai dự án bình thường và một sự tỉnh táo nhanh chóng kiểm tra dự án thử nghiệm có cùng một vấn đề với bảng AspNetUserRoles. Đó là một bảng nối, và khi nhập nó vào thiết kế của EF, mọi thứ đều ổn. Bạn sẽ không nhìn thấy nó vì nó là một mối quan hệ nhiều với nhiều, và khi kiểm tra sự liên kết giữa AspNetRole và AspNetUser nó có vẻ tốt.

thiết kế và lập bản đồ chi tiết:

Model First mapping OK

Tuy nhiên, khi tạo ra các kịch bản sql, EF sẽ thay đổi các phím.

thiết kế và lập bản đồ chi tiết:

enter image description here

tạo kịch bản SQL:

-- Creating table 'AspNetUserRoles' 
CREATE TABLE [dbo].[AspNetUserRoles] (
[AspNetRoles_Id] nvarchar(128) NOT NULL, 
[AspNetUsers_Id] nvarchar(128) NOT NULL 
); 
GO 

Trong EF, bạn không thể thay đổi tên của các ánh xạ trong thiết kế (thread on social.msdn.microsoft.com).

Sau đó sự sáng tạo của một người dùng mới wil thất bại, sử dụng bối cảnh ban đầu được tạo ra vì bảng ngã ba chứa các cột sai:

Server Error in '/' Application.

Invalid column name 'UserId'.

Invalid column name 'UserId'.

Invalid column name 'UserId'.

Invalid column name 'RoleId'.

Invalid column name 'UserId'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'UserId'. Invalid column name 'UserId'. Invalid column name 'UserId'. Invalid column name 'RoleId'. Invalid column name 'UserId'.

Source Error:

Line 89: {

Line 90: var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

Line 91: IdentityResult result = await UserManager.CreateAsync(user, model.Password);

Line 92: if (result.Succeeded)

Line 93: {

giải pháp là gì? Có bất kỳ lựa chọn thay thế nào hơn là cố gắng thay đổi tập lệnh đã tạo hoặc chuyển sang Mã đầu tiên không?

+1

Tôi đã trả lời câu hỏi này trong các nhận xét trên blog của mình. Vui lòng xem điều đó để biết thêm chi tiết (danieleagle.com/blog/2014/05/setting-up-asp-net-identity-framework-2-0-with-database-first-vs2013-update-2-spa-template/) . Nếu bạn có bất kỳ may mắn với đề xuất của tôi, tôi có thể gửi chúng như là một câu trả lời cho câu hỏi này. Tôi muốn đảm bảo nó hữu ích trước tiên để phần còn lại của cộng đồng có thể được hưởng lợi. –

+0

Cảm ơn bạn đã trả lời chi tiết. Nếu tôi có thể tóm tắt, bạn đang nói: (1) sử dụng Model First để thiết kế các thực thể và kịch bản tạo cơ sở dữ liệu (2) sử dụng kịch bản lệnh SQL được tạo ra từ Code First để tạo các bảng Identity và các mối quan hệ (3) không sử dụng phương thức Model First cho thiết kế bất cứ điều gì liên quan đến Identity? Điều đó có nghĩa là với tôi rằng Identity and Model First không có đầy đủ chức năng và cần có một giải pháp thay thế (như của bạn). – JeroenW

+0

Vâng, đúng vậy. Đó là mức độ hiểu biết hiện tại của tôi. Tôi rất vui khi được biết nếu có cách nào khác. Thực tế là cách thức Khung 2.0 được thực hiện dựa trên Code First. Vì vậy, tại thời điểm này trong thời gian sử dụng nó bên ngoài của Code First đòi hỏi một chút hack và cách sử dụng cách giải quyết. Tôi hy vọng trong các bản phát hành trong tương lai, họ sẽ làm điều này dễ dàng hơn. Nếu bất cứ ai khác biết cách tốt hơn tôi muốn nghe nó như tôi chắc chắn bạn sẽ là tốt. –

Trả lời

0

Nếu bạn ở begginning và db vẫn còn trống hơn Tôi tin rằng cách giải quyết đơn giản nhất là:

  1. Tạo EF Model (edmx).
  2. Nhấp chuột phải vào mô hình "Tạo cơ sở dữ liệu từ mô hình".
  3. Nó sẽ tạo tệp DDL (đoạn dưới đây)
  4. Thay thế tất cả sai "AspNetUsers_Id" và "AspNetRoles_Id" cho các giá trị chính xác.
  5. Nhấp chuột phải "thực thi".

    Làm việc cho tôi. -- Creating non-clustered index for FOREIGN KEY 'FK_AspNetUserRoles_AspNetUser' CREATE INDEX [IX_FK_AspNetUserRoles_AspNetUser] ON [dbo].[AspNetUserRoles] ([AspNetUsers_Id]); //replace for UserId

Mã hóa vui vẻ!

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