【问题标题】:Cannot use table 'AspNetUsers' in schema '' for entity 'AspNetUsers' since it is being used for another entity无法在实体“AspNetUsers”的架构“”中使用表“AspNetUsers”,因为它正在用于另一个实体
【发布时间】:2016-01-03 09:23:12
【问题描述】:

我们正在尝试通过扩展 AspNetUsers 将 Identity 3 添加到我们现有的客户应用中

    public class ApplicationUser : IdentityUser
{
    public string BusinessName { get; set; }
    public string ContactName { get; set; }
    public string CountryCode { get; set; }
    public virtual Countries Country { get; set; }
    public string AddressLabel { get; set; }
    public string Phone { get; set; }
    public DateTime? FollowUp { get; set; }
    public bool MailingList { get; set; }
    public int SubscriptionId { get; set; }
    [ForeignKey("SubscriptionId")]
    public virtual Subscriptions Subscription { get; set; }
    public virtual ICollection<Devices> Devices { get; set; }
    public virtual ICollection<Downloads> Downloads { get; set; }
    public virtual ICollection<Invoices> Invoices { get; set; }
    public virtual ICollection<Notes> Notes { get; set; }
    public virtual ICollection<Referrals> Referrals { get; set; }
}

CustomersContext 继承自 IdentityDbContext

    public partial class CustomersContext : IdentityDbContext<ApplicationUser>
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=(localdb)\\mssqllocaldb;Database=Customers;Trusted_Connection=True;MultipleActiveResultSets=true");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);// we have to do this becauee we are inheriting from IdentityDbContext<ApplicationUser> not DbContext
        modelBuilder.Entity<AspNetRoleClaims>(entity =>
        {
            entity.Property(e => e.RoleId).HasMaxLength(450);

            entity.HasOne(d => d.Role).WithMany(p => p.AspNetRoleClaims).HasForeignKey(d => d.RoleId);
        });

        modelBuilder.Entity<AspNetRoles>(entity =>
        {
            entity.HasIndex(e => e.NormalizedName).HasName("RoleNameIndex");

            entity.Property(e => e.Id).HasMaxLength(450);

            entity.Property(e => e.Name).HasMaxLength(256);

            entity.Property(e => e.NormalizedName).HasMaxLength(256);
        });

        modelBuilder.Entity<AspNetUserClaims>(entity =>
        {
            entity.Property(e => e.UserId).HasMaxLength(450);

            entity.HasOne(d => d.User).WithMany(p => p.AspNetUserClaims).HasForeignKey(d => d.UserId);
        });

        modelBuilder.Entity<AspNetUserLogins>(entity =>
        {
            entity.HasKey(e => new { e.LoginProvider, e.ProviderKey });

            entity.Property(e => e.LoginProvider).HasMaxLength(450);

            entity.Property(e => e.ProviderKey).HasMaxLength(450);

            entity.Property(e => e.UserId).HasMaxLength(450);

            entity.HasOne(d => d.User).WithMany(p => p.AspNetUserLogins).HasForeignKey(d => d.UserId);
        });

        modelBuilder.Entity<AspNetUserRoles>(entity =>
        {
            entity.HasKey(e => new { e.UserId, e.RoleId });

            entity.Property(e => e.UserId).HasMaxLength(450);

            entity.Property(e => e.RoleId).HasMaxLength(450);

            entity.HasOne(d => d.Role).WithMany(p => p.AspNetUserRoles).HasForeignKey(d => d.RoleId).OnDelete(DeleteBehavior.Restrict);

            entity.HasOne(d => d.User).WithMany(p => p.AspNetUserRoles).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<ApplicationUser>(entity =>
        {
            entity.HasIndex(e => e.BusinessName).HasName("BusinessNameIndex");

            entity.HasIndex(e => e.NormalizedEmail).HasName("EmailIndex");

            entity.HasIndex(e => e.NormalizedUserName).HasName("UserNameIndex");

            entity.Property(e => e.Id).HasMaxLength(450);

            entity.Property(e => e.AddressLabel)
                .HasMaxLength(255)
                .HasColumnType("varchar");

            entity.Property(e => e.BusinessName)
                .HasMaxLength(255)
                .HasColumnType("varchar");

            entity.Property(e => e.ContactName)
                .HasMaxLength(255)
                .HasColumnType("varchar");

            entity.Property(e => e.CountryCode)
                .IsRequired()
                .HasMaxLength(2)
                .HasColumnType("varchar")
                .HasDefaultValue("00");

            entity.Property(e => e.Email).HasMaxLength(256);

            entity.Property(e => e.FollowUp).HasColumnType("date");

            entity.Property(e => e.MailingList).HasDefaultValue(true);

            entity.Property(e => e.NormalizedEmail).HasMaxLength(256);

            entity.Property(e => e.NormalizedUserName).HasMaxLength(256);

            entity.Property(e => e.UserName).HasMaxLength(256);

            entity.HasOne(d => d.Country).WithMany(p => p.Users).HasForeignKey(d => d.CountryCode).OnDelete(DeleteBehavior.Restrict);

            entity.HasOne(d => d.Subscription).WithMany(p => p.Users).HasForeignKey(d => d.SubscriptionId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<Countries>(entity =>
        {
            entity.HasKey(e => e.CountryCode);

            entity.Property(e => e.CountryCode)
                .HasMaxLength(2)
                .HasColumnType("varchar");

            entity.Property(e => e.CalCost).HasColumnType("decimal");

            entity.Property(e => e.CountryName)
                .IsRequired()
                .HasMaxLength(50)
                .HasColumnType("varchar");

            entity.Property(e => e.CultureCode)
                .IsRequired()
                .HasMaxLength(8)
                .HasColumnType("varchar");

            entity.Property(e => e.CurrencyCode)
                .IsRequired()
                .HasMaxLength(3)
                .HasColumnType("varchar");

            entity.Property(e => e.InvoiceFooter)
                .HasMaxLength(50)
                .HasColumnType("varchar");

            entity.Property(e => e.InvoiceName)
                .IsRequired()
                .HasMaxLength(50)
                .HasColumnType("varchar");

            entity.Property(e => e.TaxName)
                .HasMaxLength(3)
                .HasColumnType("varchar");

            entity.Property(e => e.TaxRate).HasColumnType("decimal");
        });

        modelBuilder.Entity<Devices>(entity =>
        {
            entity.HasKey(e => e.DeviceID);

            entity.Property(e => e.CALs).HasDefaultValue(0);

            entity.Property(e => e.DeviceName)
                .IsRequired()
                .HasMaxLength(50)
                .HasColumnType("varchar");

            entity.Property(e => e.UnlockedFrom).HasColumnType("date");

            entity.Property(e => e.UnlockedTo).HasColumnType("date");

            entity.Property(e => e.UserId)
                .IsRequired()
                .HasMaxLength(450);

            entity.HasOne(d => d.User).WithMany(p => p.Devices).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<Downloads>(entity =>
        {
            entity.HasKey(e => e.DownloadId);

            entity.Property(e => e.DownloadDate).HasColumnType("date");

            entity.Property(e => e.DownloadVersion)
                .IsRequired()
                .HasMaxLength(50)
                .HasColumnType("varchar");

            entity.Property(e => e.UserId)
                .IsRequired()
                .HasMaxLength(450);

            entity.HasOne(d => d.User).WithMany(p => p.Downloads).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<Invoices>(entity =>
        {
            entity.HasKey(e => e.InvoiceNr);

            entity.Property(e => e.AddressLabel)
                .IsRequired()
                .HasMaxLength(255)
                .HasColumnType("varchar");

            entity.Property(e => e.InvoiceDate).HasColumnType("date");

            entity.Property(e => e.InvoiceDescription)
                .IsRequired()
                .HasMaxLength(255)
                .HasColumnType("varchar");

            entity.Property(e => e.InvoiceNet).HasColumnType("money");

            entity.Property(e => e.InvoiceTax).HasColumnType("money");

            entity.Property(e => e.InvoiceTotal).HasColumnType("money");

            entity.Property(e => e.UserId)
                .IsRequired()
                .HasMaxLength(450);

            entity.HasOne(d => d.User).WithMany(p => p.Invoices).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<Notes>(entity =>
        {
            entity.HasKey(e => e.NoteId);

            entity.Property(e => e.NoteDate).HasColumnType("date");

            entity.Property(e => e.NoteSubject)
                .IsRequired()
                .HasMaxLength(50)
                .HasColumnType("varchar");

            entity.Property(e => e.NoteText)
                .IsRequired()
                .HasColumnType("varchar");

            entity.Property(e => e.UserId)
                .IsRequired()
                .HasMaxLength(450);

            entity.HasOne(d => d.User).WithMany(p => p.Notes).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<ReferralSources>(entity =>
        {
            entity.HasKey(e => e.ReferralSourceId);

            entity.Property(e => e.ReferralSourceName)
                .IsRequired()
                .HasMaxLength(50)
                .HasColumnType("varchar");
        });

        modelBuilder.Entity<Referrals>(entity =>
        {
            entity.HasKey(e => e.ReferralId);

            entity.Property(e => e.ReferralDate).HasColumnType("date");

            entity.Property(e => e.UserId)
                .IsRequired()
                .HasMaxLength(450);

            entity.HasOne(d => d.ReferralSource).WithMany(p => p.Referrals).HasForeignKey(d => d.ReferralSourceID).OnDelete(DeleteBehavior.Restrict);

            entity.HasOne(d => d.User).WithMany(p => p.Referrals).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<Subscriptions>(entity =>
        {
            entity.HasKey(e => e.SubscriptionId);

            entity.Property(e => e.SubscriberId)
                .IsRequired()
                .HasMaxLength(450);

            entity.Property(e => e.SubscriptionExpires).HasColumnType("date");
            entity.Property(e => e.TotalCALs).HasDefaultValue(0);

        });
    }

    public virtual DbSet<AspNetRoleClaims> AspNetRoleClaims { get; set; }
    public virtual DbSet<AspNetRoles> AspNetRoles { get; set; }
    public virtual DbSet<AspNetUserClaims> AspNetUserClaims { get; set; }
    public virtual DbSet<AspNetUserLogins> AspNetUserLogins { get; set; }
    public virtual DbSet<AspNetUserRoles> AspNetUserRoles { get; set; }
    public virtual DbSet<ApplicationUser> ApplicationUser { get; set; }
    public virtual DbSet<Countries> Countries { get; set; }
    public virtual DbSet<Devices> Devices { get; set; }
    public virtual DbSet<Downloads> Downloads { get; set; }
    public virtual DbSet<Invoices> Invoices { get; set; }
    public virtual DbSet<Notes> Notes { get; set; }
    public virtual DbSet<ReferralSources> ReferralSources { get; set; }
    public virtual DbSet<Referrals> Referrals { get; set; }
    public virtual DbSet<Subscriptions> Subscriptions { get; set; }
}

我们正在尝试使用 Microsoft 身份验证。当我运行应用程序并使用 Microsoft 帐户登录时,应用程序会在此行的 AccountController ExternalLoginCallback 中爆炸

 var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);

错误是

Cannot use table 'AspNetUsers' in schema '' for entity 'AspNetUsers' since it is being used for another entity.

除了CustomersContext 之外没有其他dbContext。除了 ApplicationUser,我找不到任何映射到 AspNetUser 的实体。

没有迁移。如果我尝试创建初始迁移,也会出现同样的错误。

dnx ef migrations add initial

对包含的代码量表示歉意,但不包括关键信息。

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc entity-framework-core asp.net-identity-3


    【解决方案1】:

    由于您继承自 IdentityDbContext,因此您无需重新创建 AspNet* DbSet,只需添加新表即可。
    您的 CustomersContext 应如下所示:

    public partial class CustomersContext : IdentityDbContext<ApplicationUser>
    {
        protected override void OnConfiguring(DbContextOptionsBuilder options)
        {
            options.UseSqlServer(@"Server=(localdb)\\mssqllocaldb;Database=Customers;Trusted_Connection=True;MultipleActiveResultSets=true");
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);// we have to do this because we are inheriting from IdentityDbContext<ApplicationUser> not DbContext
    
            // override the users tables with your properties
            modelBuilder.Entity<ApplicationUser>(entity =>
            {
                entity.HasIndex(e => e.BusinessName).HasName("BusinessNameIndex");
    
                entity.HasIndex(e => e.NormalizedEmail).HasName("EmailIndex");
    
                entity.HasIndex(e => e.NormalizedUserName).HasName("UserNameIndex");
    
                entity.Property(e => e.Id).HasMaxLength(450);
    
                entity.Property(e => e.AddressLabel)
                    .HasMaxLength(255)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.BusinessName)
                    .HasMaxLength(255)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.ContactName)
                    .HasMaxLength(255)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.CountryCode)
                    .IsRequired()
                    .HasMaxLength(2)
                    .HasColumnType("varchar")
                    .HasDefaultValue("00");
    
                entity.Property(e => e.FollowUp).HasColumnType("date");
    
                entity.Property(e => e.MailingList).HasDefaultValue(true);
    
                entity.HasOne(d => d.Country).WithMany(p => p.Users).HasForeignKey(d => d.CountryCode).OnDelete(DeleteBehavior.Restrict);
    
                entity.HasOne(d => d.Subscription).WithMany(p => p.Users).HasForeignKey(d => d.SubscriptionId).OnDelete(DeleteBehavior.Restrict);
            });
    
            modelBuilder.Entity<Countries>(entity =>
            {
                entity.HasKey(e => e.CountryCode);
    
                entity.Property(e => e.CountryCode)
                    .HasMaxLength(2)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.CalCost).HasColumnType("decimal");
    
                entity.Property(e => e.CountryName)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.CultureCode)
                    .IsRequired()
                    .HasMaxLength(8)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.CurrencyCode)
                    .IsRequired()
                    .HasMaxLength(3)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.InvoiceFooter)
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.InvoiceName)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.TaxName)
                    .HasMaxLength(3)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.TaxRate).HasColumnType("decimal");
            });
    
            modelBuilder.Entity<Devices>(entity =>
            {
                entity.HasKey(e => e.DeviceID);
    
                entity.Property(e => e.CALs).HasDefaultValue(0);
    
                entity.Property(e => e.DeviceName)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.UnlockedFrom).HasColumnType("date");
    
                entity.Property(e => e.UnlockedTo).HasColumnType("date");
    
                entity.Property(e => e.UserId)
                    .IsRequired()
                    .HasMaxLength(450);
    
                entity.HasOne(d => d.User).WithMany(p => p.Devices).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
            });
    
            modelBuilder.Entity<Downloads>(entity =>
            {
                entity.HasKey(e => e.DownloadId);
    
                entity.Property(e => e.DownloadDate).HasColumnType("date");
    
                entity.Property(e => e.DownloadVersion)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.UserId)
                    .IsRequired()
                    .HasMaxLength(450);
    
                entity.HasOne(d => d.User).WithMany(p => p.Downloads).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
            });
    
            modelBuilder.Entity<Invoices>(entity =>
            {
                entity.HasKey(e => e.InvoiceNr);
    
                entity.Property(e => e.AddressLabel)
                    .IsRequired()
                    .HasMaxLength(255)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.InvoiceDate).HasColumnType("date");
    
                entity.Property(e => e.InvoiceDescription)
                    .IsRequired()
                    .HasMaxLength(255)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.InvoiceNet).HasColumnType("money");
    
                entity.Property(e => e.InvoiceTax).HasColumnType("money");
    
                entity.Property(e => e.InvoiceTotal).HasColumnType("money");
    
                entity.Property(e => e.UserId)
                    .IsRequired()
                    .HasMaxLength(450);
    
                entity.HasOne(d => d.User).WithMany(p => p.Invoices).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
            });
    
            modelBuilder.Entity<Notes>(entity =>
            {
                entity.HasKey(e => e.NoteId);
    
                entity.Property(e => e.NoteDate).HasColumnType("date");
    
                entity.Property(e => e.NoteSubject)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
    
                entity.Property(e => e.NoteText)
                    .IsRequired()
                    .HasColumnType("varchar");
    
                entity.Property(e => e.UserId)
                    .IsRequired()
                    .HasMaxLength(450);
    
                entity.HasOne(d => d.User).WithMany(p => p.Notes).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
            });
    
            modelBuilder.Entity<ReferralSources>(entity =>
            {
                entity.HasKey(e => e.ReferralSourceId);
    
                entity.Property(e => e.ReferralSourceName)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnType("varchar");
            });
    
            modelBuilder.Entity<Referrals>(entity =>
            {
                entity.HasKey(e => e.ReferralId);
    
                entity.Property(e => e.ReferralDate).HasColumnType("date");
    
                entity.Property(e => e.UserId)
                    .IsRequired()
                    .HasMaxLength(450);
    
                entity.HasOne(d => d.ReferralSource).WithMany(p => p.Referrals).HasForeignKey(d => d.ReferralSourceID).OnDelete(DeleteBehavior.Restrict);
    
                entity.HasOne(d => d.User).WithMany(p => p.Referrals).HasForeignKey(d => d.UserId).OnDelete(DeleteBehavior.Restrict);
            });
    
            modelBuilder.Entity<Subscriptions>(entity =>
            {
                entity.HasKey(e => e.SubscriptionId);
    
                entity.Property(e => e.SubscriberId)
                    .IsRequired()
                    .HasMaxLength(450);
    
                entity.Property(e => e.SubscriptionExpires).HasColumnType("date");
                entity.Property(e => e.TotalCALs).HasDefaultValue(0);
    
            });
        }
    
        public virtual DbSet<Countries> Countries { get; set; }
        public virtual DbSet<Devices> Devices { get; set; }
        public virtual DbSet<Downloads> Downloads { get; set; }
        public virtual DbSet<Invoices> Invoices { get; set; }
        public virtual DbSet<Notes> Notes { get; set; }
        public virtual DbSet<ReferralSources> ReferralSources { get; set; }
        public virtual DbSet<Referrals> Referrals { get; set; }
        public virtual DbSet<Subscriptions> Subscriptions { get; set; }
    }
    

    或者你可以完全创建模型而不调用base.OnModelCreating,你可以复制OnModelCreatingfrom the source code

    【讨论】:

    • 谢谢来自火星的@agua。我已按照您的建议从 CustomersContext 中删除了 AspNet* DbSet,但是在同一行上再次出现相同的错误。运行 'dnx ef database update -c CustomersContext' 时,同样的错误仍然会再次出现
    • 我来自火星的错误@agua。我没有从 CustomersContext 中删除所有 AspNet* DbSet。现在我有了,而且效果很好!
    【解决方案2】:

    我在使用以下场景时遇到了同样的问题:

    1. 脚手架标识(代码优先)
    2. 使用迁移(代码优先)使用身份表更新同一个数据库
    3. 从数据库中搭建数据库上下文。 (分贝优先)

    目前我正在尝试使用单独的数据库作为身份以获得以下收益:

    1. 将 Microsoft 标识保留为单独的模块,以便您可以更新 它或从您的应用程序中轻松删除它。
    2. 创建单个 在多个应用程序之间登录架构。
    3. 保持 两种方式都灵活的应用程序上下文,即 DB-first 或 随时以代码为先。

    现在的挑战是在应用程序的数据层同时使用这两个数据库。

    【讨论】:

    • 这是一个答案吗?
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2018-09-22
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多