3

我们正在尝试通过扩展 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

为包含的代码量道歉,但不包括该关键信息,无论它是什么。

4

2 回答 2

9

当您从 继承时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中复制OnModelCreating

于 2016-01-03T10:55:58.487 回答
1

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

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

目前,我正在尝试使用单独的数据库来获取以下收益:

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

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

于 2019-04-21T20:39:24.607 回答