2014-06-11 15 views
14

Một số thời gian trước đây, tôi đã tạo một trang ASP.NET MVC 5 với phiên bản Identity 1.0 và tôi đã tạo ra các bảng Identity với dự án này. Bây giờ tôi phải làm cho trang web khác sử dụng cùng một cơ sở dữ liệu để xác thực, nhưng bây giờ phiên bản Identity là 2.0. Vì vậy, khi tôi cố gắng xác thực trong trang web mới, tôi nhận được một số lỗi.Đã có một đối tượng có tên 'AspNetRoles' trong cơ sở dữ liệu

Tôi đang cố gắng di chuyển cơ sở dữ liệu bằng cách sử dụng phương pháp di chuyển, nhưng nó bị nhầm lẫn và nhận được lỗi này There is already an object named 'AspNetRoles' in the database. khi tôi gõ Update-Database trong giao diện điều khiển PM.

Câu hỏi của tôi là, cách tốt nhất để sử dụng cùng cơ sở dữ liệu cho xác thực của cả hai trang web (một bằng cách sử dụng phiên bản 1.0 và phiên bản khác sử dụng 2.0). Tôi có thực sự cần di chuyển cơ sở dữ liệu không?

Nếu có, làm thế nào tôi có thể giải quyết lỗi này mà nhận được?

Trả lời

33
Add-Migration InitialMigrations -IgnoreChanges 

Điều này sẽ tạo tệp "InitialMigration" trống. Bây giờ, thêm bất kỳ thay đổi mong muốn nào cho lớp bạn muốn. Khi thay đổi được thêm vào, hãy chạy lệnh cập nhật một lần nữa:

update-database -verbose 

Bây giờ di chuyển tự động sẽ được áp dụng và bảng sẽ được thay đổi với những thay đổi của bạn.

Edit: Dưới đây là một giải pháp để di chuyển danh tính 1-2 Upgrading from ASP.NET.Identity 1.0 to 2.0 Dùng tay di cư này

public override void Up() 
    { 
     RenameColumn(table: "dbo.AspNetUserClaims", name: "User_Id", newName: "UserId"); 
     RenameIndex(table: "dbo.AspNetUserClaims", name: "IX_User_Id", newName: "IX_UserId"); 
     DropPrimaryKey("dbo.AspNetUserLogins"); 
     AddColumn("dbo.AspNetUsers", "Email", c => c.String(maxLength: 256)); 
     AddColumn("dbo.AspNetUsers", "EmailConfirmed", c => c.Boolean(nullable: false)); 
     AddColumn("dbo.AspNetUsers", "PhoneNumber", c => c.String()); 
     AddColumn("dbo.AspNetUsers", "PhoneNumberConfirmed", c => c.Boolean(nullable: false)); 
     AddColumn("dbo.AspNetUsers", "TwoFactorEnabled", c => c.Boolean(nullable: false)); 
     AddColumn("dbo.AspNetUsers", "LockoutEndDateUtc", c => c.DateTime()); 
     AddColumn("dbo.AspNetUsers", "LockoutEnabled", c => c.Boolean(nullable: false)); 
     AddColumn("dbo.AspNetUsers", "AccessFailedCount", c => c.Int(nullable: false)); 
     AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: false, maxLength: 256)); 
     AlterColumn("dbo.AspNetUsers", "FirstName", c => c.String(nullable: false)); 
     AlterColumn("dbo.AspNetUsers", "LastName", c => c.String(nullable: false)); 
     AddColumn("dbo.AspNetUsers", "CreatedDateTime", c => c.DateTime(nullable: false)); 
     AlterColumn("dbo.AspNetRoles", "Name", c => c.String(nullable: false, maxLength: 256)); 
     AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" }); 
     CreateIndex("dbo.AspNetUsers", "UserName", unique: true, name: "UserNameIndex"); 
     CreateIndex("dbo.AspNetRoles", "Name", unique: true, name: "RoleNameIndex"); 
     DropColumn("dbo.AspNetUsers", "Discriminator"); 
    } 
+0

cảm ơn! bây giờ tôi không nhận được lỗi này, nhưng im nhận được điều này "" Tên cột không hợp lệ 'Email'. \ r \ nTên cột không hợp lệ 'EmailConfirmed'. \ r \ nTên cột không hợp lệ 'PhoneNumber'. "khi tôi cố gắng đăng nhập. tôi cần phải làm trong mô hình người dùng này? Im sử dụng IdentityUser mà không có thuộc tính tùy chỉnh. – gog

+0

Đây là giải pháp để di chuyển danh tính 1 đến 2 [link] http://adamstephensen.com/2014/05/02/upgrading-from-asp-net-identity-1-0-to-2-0/ –

9

Trong khi bạn có thể (vì EF6) sử dụng di chuyển trong hai dự án riêng biệt cho cùng một cơ sở dữ liệu, không thể có bất kỳ trùng lặp nào. Cách di chuyển hoạt động thông qua bảng dbo._MigrationHistory lưu trữ ngữ cảnh tạo ra quá trình di chuyển và trạng thái mô hình của ứng dụng của bạn, bao gồm các mô hình Identity.

Khi bạn cố gắng kết nối ứng dụng thứ hai của bạn, nó không tìm thấy di chuyển trước đó và do đó cần tạo lần di chuyển ban đầu, bao gồm các bảng cho mô hình Identity, cũng trong ngữ cảnh của nó. Đó là nơi mà vấn đề của bạn là.

Với mục đích nhận dạng, bạn cần phải chọn một dự án để làm chủ. Điều này sẽ sử dụng một tiêu chuẩn IdentityDbContext, nơi các mô hình nhận dạng sẽ được di chuyển.

Dự án khác sẽ cần phải được thực hiện một nô lệ, ít nhất là trong việc sử dụng Nhận dạng. Vì vậy, bạn sẽ cần phải tương tác với ít nhất hai bối cảnh trong ứng dụng này. Một sẽ là một lớp con của IdentityDbContext, nhưng coi như cơ sở dữ liệu đầu tiên:

public class MyIdentityContext : IdentityDbContext<ApplicationUser> 
{ 
    public MyIdentityContext() 
     : base("ConnectionStringNameForYourSharedDB") 
    { 
     Database.SetInitializer<MyIdentityContext>(null); 
    } 
} 

Bối cảnh khác sẽ chỉ là một DbContext lớp con bình thường mà sẽ được di chuyển như bình thường. Bạn sẽ cần phải lặp lại điều này cho bất kỳ dự án nào khác có thể cần quyền truy cập vào cùng một thông tin danh tính từ cùng một cơ sở dữ liệu. Ngoài ra, vì mã lặp lại này sẽ dẫn đến (và thực tế là lớp ApplicationUser của bạn sẽ cần được chia sẻ), bạn nên di chuyển mã này vào thư viện lớp mà mỗi dự án có thể tham chiếu.

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