Я пытаюсь создать отношения «многие ко многим» между ApplicationUser и Courses в моем приложении, но при попытке вставить запись в таблицу CourseUsers я получаю следующую ошибку:
The Оператор INSERT конфликтует с ограничением FOREIGN KEY «FK_CourseUsers_AspNetUsers_UserId». Конфликт произошел в базе данных «PIL», таблица «dbo.AspNetUsers», столбец «Id». Оператор был прерван.
Я не могу понять, в чем проблема. Я следил за документацией здесь: https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key
Моя модель пользователя:
public class ApplicationUser : IdentityUser
{
public DateTime Created { get; set; }
public DateTime LastActive { get; set; }
public List<CourseUser> CourseUsers { get; set; }
public List<UserRole> UserRoles { get; set; }
}
Моя модель курса:
public class Course
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Subtitle { get; set; }
public string ThumbnailUrl { get; set; }
public string PreviewVideoUrl { get; set; }
public string Topics { get; set; }
public decimal Cost { get; set; }
public List<CourseContributor> CourseContributors { get; set; }
public List<CourseUser> CourseUsers { get; set; }
public List<Lesson> Lessons { get; set; }
public string Grades { get; set; }
}
Моя модель поиска:
public class CourseUser
{
public int CourseId { get; set; }
public Course Course { get; set; }
public string UserId { get; set; }
public ApplicationUser User { get; set; }
}
My DataContext:
public class DataContext : IdentityDbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options) { }
public DbSet<Lesson> Lessons { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<Contributor> Contributors { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CourseContributor>()
.HasKey(c => new { c.CourseId, c.ContributorId });
modelBuilder.Entity<CourseContributor>()
.HasOne(cc => cc.Contributor)
.WithMany(c => c.CourseContributors)
.HasForeignKey(ct => ct.ContributorId);
modelBuilder.Entity<CourseContributor>()
.HasOne(cc => cc.Course)
.WithMany(c => c.CourseContributors)
.HasForeignKey(ct => ct.CourseId);
modelBuilder.Entity<CourseUser>()
.HasKey(c => new { c.CourseId, c.UserId });
modelBuilder.Entity<CourseUser>()
.HasOne(u => u.User)
.WithMany(c => c.CourseUsers)
.HasForeignKey(us => us.UserId);
modelBuilder.Entity<CourseUser>()
.HasOne(cc => cc.Course)
.WithMany(c => c.CourseUsers)
.HasForeignKey(ct => ct.CourseId);
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Lesson>().HasData(new Lesson() { Id = 1, Title = "Test Lesson", SubTitle = "Test Lesson Title", Description = "Test Lesson Description", DocUrl = "fdsafdsffds", ThumbnailUrl = "https://media.gettyimages.com/photos/stack-of-books-picture-id157482029?s=612x612", VideoUrl = "testVideoUrl", CourseId = 1 });
modelBuilder.Entity<Contributor>().HasData(new Contributor() { Id = 1, FirstName = "Test First Name", LastName = "Test Last Name" });
modelBuilder.Entity<Course>().HasData(new Course() { Id = 1, Title = "Test Course", Subtitle = "Test Course Title", Description = "Test Course Description", Cost = 20.00M, Grades = "1,2,3", PreviewVideoUrl = "Test Preview Video Url", ThumbnailUrl = "https://media.gettyimages.com/photos/stack-of-books-picture-id157482029?s=612x612", Topics = "Test Topic 1|Test Topic 2|Test Topic 3" });
modelBuilder.Entity<CourseContributor>().HasData(new CourseContributor() { CourseId = 1, ContributorId = 1 });
modelBuilder.Entity<CourseUser>().HasData(new CourseUser() { CourseId = 1, UserId = "1234" });
}
}
РЕДАКТИРОВАТЬ: вот метод заполнения пользователя
public class Seed
{
public static void SeedUsers(UserManager<ApplicationUser> userManager)
{
if (!userManager.Users.Any())
{
userManager.CreateAsync(new ApplicationUser { Id = "1234", UserName = "test@test.org", Created = DateTime.UtcNow, LastActive = DateTime.UtcNow, Email = "test@test.org" }, "Password1!").Wait();
}
}
}
И Program.cs:
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<DataContext>();
var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
context.Database.Migrate();
Seed.SeedUsers(userManager);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occured during migration");
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}