簡體   English   中英

ApplicationUser DbContext與我的DBcontext合並

[英]ApplicationUser DbContext Merge with My DBcontext

我有一個我已經意識到的應用程序,它愚蠢地具有兩個單獨的DBcontext,並且需要將它們合並以允許應用程序實體和ApplicationUser實體之間的關系。

隨着應用程序的開發,我相信在其他類中對applicationUser的引用已在我的DBcontext上為ApplicationUser實體創建了表,而在不同的連接字符串和上下文中,存在AspUserIdentity ect的表。

我試圖刪除原始上下文並合並兩個上下文,但是在嘗試創建遷移時,它想將當前上下文中的所有現有ApplicationUser表重命名為AspUserIdentity ect(請參見下文)

如何才能成功合並上下文,或者還有其他解決方案?

我不太確定要發布的內容,但我會嘗試發布我認為相關的內容,然后如果有人需要進一步的信息,可以隨時提出要求。

這是嘗試合並后的所有代碼。 (使用此問題的答案之一中的指南:將MyDbContext合並到Asp.net IdentityDbContext

我的上下文具有下表:ApplicationUsers IdentityRoles IdentityUserClaims IdentityUserLogins IdentityUserRoles

原始上下文具有下表,並且遷移正嘗試重命名上述表以使其匹配:AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRoles AspNetUsers

我的情況:( Commented Modelbuilder語句導致多重錯誤)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Configuration;
using System.Web.Mvc;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Data.Entity.ModelConfiguration.Conventions;
using eCommSite.Models;
using System.Data.Entity.Infrastructure;

namespace eCommSite.Areas.Admin.Models
{
    public class TheDBContext : IdentityDbContext 
    {

        public TheDBContext()
                : base(ConfigurationManager.ConnectionStrings["DataDBString"].ConnectionString)
            {
                var objectContext = (this as IObjectContextAdapter).ObjectContext;

                // Sets the command timeout for all the commands
                objectContext.CommandTimeout = 360;
            }
        public DbSet<ProductBase> ProductBases { get; set; }
        public DbSet<Address> Addresses { get; set; }
        public DbSet<PromotionImage> PromotionImages { get; set; }
        public DbSet<Image> Images { get; set; }
        public DbSet<ImageCollection> ImageCollections { get; set; }
        public DbSet<Order> Orders { get; set; }
        public DbSet<OrderLine> OrderLines { get; set; }
        public DbSet<ProductOption> ProductOptions { get; set; }
        public DbSet<ProductOptionType> ProductOptionTypes { get; set; }
        public DbSet<ProductType> ProductTypes { get; set; }
        public DbSet<FilterValueEntry> FilterValueEntries { get; set; }
        public DbSet<FilterType> FilterTypesDB { get; set; }
        public DbSet<CardBaseSummary> CardBaseSummarys { get; set; }
        public DbSet<ProductBaseSummary> ProductBaseSummaries { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Brand> Brands { get; set; }
        public DbSet<MMHPriceEntry> MMHPriceEntries { get; set; }
        public DbSet<Legality> Legalities { get; set; }
        public DbSet<ForeignName> ForeignNames { get; set; }
        public DbSet<SKUStockQuantity> SKUStockQuantities { get; set; }
        public DbSet<Location> Locations { get; set; }
        public DbSet<Cart> Carts { get; set; }
        public DbSet<StockCollection> StockCollections { get; set; }

        public static TheDBContext Create()
        {
            return new TheDBContext();
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();


          //  modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
          //  modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
         //   modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

        }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.ApplicationUser> ApplicationUsers { get; set; }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.ProductRelation> ProductRelations { get; set; }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.MTG_Cards> MTG_Cards { get; set; }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.MTG_Set> MTG_Set { get; set; }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.ProductOptionValue> ProductOptionValues { get; set; }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.SKU> SKUs { get; set; }

        public System.Data.Entity.DbSet<eCommSite.Areas.Admin.Models.MMHsetToJsonSetReference> MMHsetToJsonSetReferences { get; set; }

    }
}

遷移:

namespace eCommSite.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class MergeMigration : DbMigration
    {
        public override void Up()
        {
            RenameTable(name: "dbo.ApplicationUsers", newName: "AspNetUsers");
            RenameTable(name: "dbo.IdentityUserClaims", newName: "AspNetUserClaims");
            RenameTable(name: "dbo.IdentityUserLogins", newName: "AspNetUserLogins");
            RenameTable(name: "dbo.IdentityUserRoles", newName: "AspNetUserRoles");
            RenameTable(name: "dbo.IdentityRoles", newName: "AspNetRoles");
            DropIndex("dbo.AspNetUserClaims", new[] { "ApplicationUser_Id" });
            DropIndex("dbo.AspNetUserLogins", new[] { "ApplicationUser_Id" });
            DropIndex("dbo.AspNetUserRoles", new[] { "ApplicationUser_Id" });
            DropIndex("dbo.AspNetUserRoles", new[] { "IdentityRole_Id" });
            DropColumn("dbo.AspNetUserClaims", "UserId");
            DropColumn("dbo.AspNetUserLogins", "UserId");
            DropColumn("dbo.AspNetUserRoles", "UserId");
            DropColumn("dbo.AspNetUserRoles", "RoleId");
            RenameColumn(table: "dbo.AspNetUserClaims", name: "ApplicationUser_Id", newName: "UserId");
            RenameColumn(table: "dbo.AspNetUserLogins", name: "ApplicationUser_Id", newName: "UserId");
            RenameColumn(table: "dbo.AspNetUserRoles", name: "ApplicationUser_Id", newName: "UserId");
            RenameColumn(table: "dbo.AspNetUserRoles", name: "IdentityRole_Id", newName: "RoleId");
            DropPrimaryKey("dbo.AspNetUserLogins");
            DropPrimaryKey("dbo.AspNetUserRoles");
            AddColumn("dbo.AspNetUsers", "Discriminator", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUsers", "Newsletter", c => c.Boolean());
            AlterColumn("dbo.AspNetUsers", "RewardPoints", c => c.Int());
            AlterColumn("dbo.AspNetUsers", "BasketId", c => c.Int());
            AlterColumn("dbo.AspNetUsers", "BuylistBasketId", c => c.Int());
            AlterColumn("dbo.AspNetUsers", "StoreCredit", c => c.Double());
            AlterColumn("dbo.AspNetUsers", "Email", c => c.String(maxLength: 256));
            AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: false, maxLength: 256));
            AlterColumn("dbo.AspNetUserClaims", "UserId", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUserClaims", "UserId", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUserLogins", "LoginProvider", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUserLogins", "ProviderKey", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUserLogins", "UserId", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUserRoles", "UserId", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetUserRoles", "RoleId", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.AspNetRoles", "Name", c => c.String(nullable: false, maxLength: 256));
            AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
            AddPrimaryKey("dbo.AspNetUserRoles", new[] { "UserId", "RoleId" });
            CreateIndex("dbo.AspNetUsers", "UserName", unique: true, name: "UserNameIndex");
            CreateIndex("dbo.AspNetUserClaims", "UserId");
            CreateIndex("dbo.AspNetUserLogins", "UserId");
            CreateIndex("dbo.AspNetUserRoles", "UserId");
            CreateIndex("dbo.AspNetUserRoles", "RoleId");
            CreateIndex("dbo.AspNetRoles", "Name", unique: true, name: "RoleNameIndex");
        }

        public override void Down()
        {
            DropIndex("dbo.AspNetRoles", "RoleNameIndex");
            DropIndex("dbo.AspNetUserRoles", new[] { "RoleId" });
            DropIndex("dbo.AspNetUserRoles", new[] { "UserId" });
            DropIndex("dbo.AspNetUserLogins", new[] { "UserId" });
            DropIndex("dbo.AspNetUserClaims", new[] { "UserId" });
            DropIndex("dbo.AspNetUsers", "UserNameIndex");
            DropPrimaryKey("dbo.AspNetUserRoles");
            DropPrimaryKey("dbo.AspNetUserLogins");
            AlterColumn("dbo.AspNetRoles", "Name", c => c.String());
            AlterColumn("dbo.AspNetUserRoles", "RoleId", c => c.String(maxLength: 128));
            AlterColumn("dbo.AspNetUserRoles", "UserId", c => c.String(maxLength: 128));
            AlterColumn("dbo.AspNetUserLogins", "UserId", c => c.String(maxLength: 128));
            AlterColumn("dbo.AspNetUserLogins", "ProviderKey", c => c.String());
            AlterColumn("dbo.AspNetUserLogins", "LoginProvider", c => c.String());
            AlterColumn("dbo.AspNetUserClaims", "UserId", c => c.String(maxLength: 128));
            AlterColumn("dbo.AspNetUserClaims", "UserId", c => c.String());
            AlterColumn("dbo.AspNetUsers", "UserName", c => c.String());
            AlterColumn("dbo.AspNetUsers", "Email", c => c.String());
            AlterColumn("dbo.AspNetUsers", "StoreCredit", c => c.Double(nullable: false));
            AlterColumn("dbo.AspNetUsers", "BuylistBasketId", c => c.Int(nullable: false));
            AlterColumn("dbo.AspNetUsers", "BasketId", c => c.Int(nullable: false));
            AlterColumn("dbo.AspNetUsers", "RewardPoints", c => c.Int(nullable: false));
            AlterColumn("dbo.AspNetUsers", "Newsletter", c => c.Boolean(nullable: false));
            DropColumn("dbo.AspNetUsers", "Discriminator");
            AddPrimaryKey("dbo.AspNetUserRoles", new[] { "RoleId", "UserId" });
            AddPrimaryKey("dbo.AspNetUserLogins", "UserId");
            RenameColumn(table: "dbo.AspNetUserRoles", name: "RoleId", newName: "IdentityRole_Id");
            RenameColumn(table: "dbo.AspNetUserRoles", name: "UserId", newName: "ApplicationUser_Id");
            RenameColumn(table: "dbo.AspNetUserLogins", name: "UserId", newName: "ApplicationUser_Id");
            RenameColumn(table: "dbo.AspNetUserClaims", name: "UserId", newName: "ApplicationUser_Id");
            AddColumn("dbo.AspNetUserRoles", "RoleId", c => c.String(nullable: false, maxLength: 128));
            AddColumn("dbo.AspNetUserRoles", "UserId", c => c.String(nullable: false, maxLength: 128));
            AddColumn("dbo.AspNetUserLogins", "UserId", c => c.String(nullable: false, maxLength: 128));
            AddColumn("dbo.AspNetUserClaims", "UserId", c => c.String());
            CreateIndex("dbo.AspNetUserRoles", "IdentityRole_Id");
            CreateIndex("dbo.AspNetUserRoles", "ApplicationUser_Id");
            CreateIndex("dbo.AspNetUserLogins", "ApplicationUser_Id");
            CreateIndex("dbo.AspNetUserClaims", "ApplicationUser_Id");
            RenameTable(name: "dbo.AspNetRoles", newName: "IdentityRoles");
            RenameTable(name: "dbo.AspNetUserRoles", newName: "IdentityUserRoles");
            RenameTable(name: "dbo.AspNetUserLogins", newName: "IdentityUserLogins");
            RenameTable(name: "dbo.AspNetUserClaims", newName: "IdentityUserClaims");
            RenameTable(name: "dbo.AspNetUsers", newName: "ApplicationUsers");
        }
    }
}

運行更新數據庫時的錯誤:

The object 'PK_dbo.AspNetUserLogins' is dependent on column 'UserId'.
ALTER TABLE DROP COLUMN UserId failed because one or more objects access this column.

我知道您不希望得到這樣的答案,但是我強烈建議不要合並。 讓IdentityDbContext過自己的生活,它也會讓您活下去。 它(唯一)的騙局。 我需要知道,您將需要2個單獨的數據庫,這在Azure中是額外的費用,但是仍然...

  1. 如果您嘗試與IdentityDbContext一起生活在合並的上下文中,這將花費許多小時來發現其行為及其EF使用情況。 這段時間自己動手。
  2. 更多:您的身份API(用戶,角色,登錄名,鎖定等)是顯式類及其方法,而不是EF。 嚴格來說,您甚至不應該知道Identity子系統的持久性(EF + RDBMS)。 (將其視為黑匣子)
  3. 您對關系的看法是正確的,但是再說一次:如果您有一個黑盒身份子系統,該子系統可以提供所有服務(包括用戶/密碼/配置文件持久性),並且您想為一個業務案例構建一個關系數據庫,那么解決方案是什么?使用完全相同的用戶? 只需使用數據庫中其他子系統提供的用戶ID。 不必擔心兩個系統之間的參照完整性。 請考慮以下事項:在經過身份驗證的會話中,您的用戶ID將始終有效,否則您在身份驗證過程中會遇到嚴重問題,因此最需要擔心的是...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM