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

女生的网名这么多〃 提交于 2019-12-02 08:00:29

问题


We are trying to add Identity 3 to our existing Customers app by extending AspNetUsers

    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 inherits from 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; }
}

We are trying to use Microsoft authentication. When I run the app and login using Microsoft Account then the app blows up in the AccountController ExternalLoginCallback on this line

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

The error is

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

There is no other dbContext other than CustomersContext. I can't find any entities mapping to AspNetUsers other than ApplicationUser.

There are no migrations. The same error also occurs if I try to create an initial migration.

dnx ef migrations add initial

Apologies for the amount of code included and yet not including that critical piece of information whatever it is.


回答1:


As you inherit from IdentityDbContext, you don't need to recreate AspNet* DbSet, just add your new table.
Your CustomersContext should look like that:

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; }
}

Or you can completely create the model without calling base.OnModelCreating, you can copy the OnModelCreating from the source code




回答2:


I suffered from the same problem using the following scenario:

  1. Scaffolding identity (code first)
  2. Update the same DB with identity tables using migrations (code first)
  3. Scaffold the DB context from the database. (db first)

Currently I'm trying to use a separate DB for identity for the following gains:

  1. To keep Microsoft identity as a separate module so you can update it or remove it easily from your application.
  2. To create a single sign on architecture between multiple applications.
  3. To keep the application context flexible for both ways, i.e. DB-first or Code-first at any time.

The challenge now is to use the two databases together at the data tier of the application.



来源:https://stackoverflow.com/questions/34575020/cannot-use-table-aspnetusers-in-schema-for-entity-aspnetusers-since-it-is

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!