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.
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
I suffered from the same problem using the following scenario:
Currently I'm trying to use a separate DB for identity for the following gains:
The challenge now is to use the two databases together at the data tier of the application.