无法将架构中的表 'AspNetUsers' 用于实体'AspNetUsers',因为它正用于另一个实体



我们正试图通过扩展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,我找不到任何映射到AspNetUsers的实体。

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

dnx ef migrations add initial

对包含但未包含关键信息的代码数量表示歉意。

IdentityDbContext继承时,不需要重新创建AspNet* DbSet,只需添加新表即可
您的客户上下文应该是这样的:

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的情况下完全创建模型,也可以从源代码复制OnModelCreating

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

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

目前,我正在尝试使用一个单独的数据库进行身份验证,以获得以下收益:

  1. 将Microsoft标识保留为单独的模块,以便您可以更新或者将其从应用程序中轻松删除
  2. 创建单个多个应用程序之间的登录体系结构
  3. 保持应用程序上下文双向灵活,即DB优先或任何时候都要先编码

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

最新更新