У меня есть WebApplication с двумя ApplicationUsers, Cursist и лектора:Добавление ApplicationUser к результатам базы данных в иностранных Key конфликта
public class ApplicationUser : IdentityUser
{
public string Sex { get; set; }
public string FName { get; set; }
public string LName { get; set; }
//email inherited by IdentityUser
....
}
public class Cursist: ApplicationUser
{
public Group Group { get; set; }
public int GroupId { get; set; }
....
}
public class Lector: ApplicationUser
{
private IEnumerable<Group> _supervising;
....
}
Это первый раз я использую наследование с ApplicationUser, что привело к постоянной ошибке:
System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_AspNetUserClaims_AspNetUsers_UserId". The conflict occurred in database "cvodb", table "dbo.AspNetUsers", column 'Id'. The statement has been terminated.
происхождение ошибки, кажется, исходит из этого фрагмента кода:
public async Task InitializeData()
{
_dbContext.Database.EnsureDeleted();
if (_dbContext.Database.EnsureCreated())
{
await InitializeUsers();
_dbContext.SaveChanges();
}
}
private async Task InitializeUsers()
{
ApplicationUser user = new Cursist("Male", "fname", "lname", "[email protected]");
await _userManager.CreateAsync(user, "password");
await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, "Cursist"));
}
EDIT после изменений Мне удалось разрешить конфликт UserId, добавив UserName в ApplicationUserId. В классах выглядеть следующим образом:
public class ApplicationUser : IdentityUser
{
public string Sex { get; set; }
public string FName { get; set; }
public string LName { get; set; }
//email inherited by IdentityUser
public ApplicationUser(string Sex, string fname, string lname, string email)
{
base.Email = email;
//username fixes foreign key conflict?
base.UserName = email;
Sex = sex;
FName = fname;
LName = lname;
}
}
public class Cursist: ApplicationUser
{
public Group Group { get; set; }
// can be null
public int? GroupId { get; set; }
}
//Lector class hasn't changed.
Я получаю этот вывод в консоли (игнорировать различие правописания):
ALTER TABLE [AspNetUsers] ADD CONSTRAINT [FK_AspNetUsers_Groep_GroepId] FOREIGN KEY ([GroepId]) REFERENCES [Groep] ([GroepId]) ON DELETE NO ACTION; Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory:Information: Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE [AspNetUsers] ADD CONSTRAINT [FK_AspNetUsers_Groep_GroepId1] FOREIGN KEY ([GroepId1]) REFERENCES [Groep] ([GroepId]) ON DELETE NO ACTION; Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory:Information: Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE [AspNetUsers] ADD CONSTRAINT [FK_AspNetUsers_Groep_GroepId2] FOREIGN KEY ([GroepId2]) REFERENCES [Groep] ([GroepId]) ON DELETE NO ACTION;
Я не знаю, почему AspNetUsers создает 3 экземпляров groupIds? Первый экземпляр и второй экземпляр не генерируют никаких ошибок, но последний делает:
{Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_AspNetUsers_Groep_GroepId2". The conflict occurred in database "cvodb", table "dbo.Groep", column 'GroepId'. The statement has been terminated.
У меня есть ощущение, что он пытается связать объект группового, однако группа может быть нулевым значением. Я все еще не уверен, почему есть groupId, groupId1 и groupId2.
У меня есть класс под названием Group и два подкласса ClosedGroup и OpenGroup. Они должны использовать один и тот же ключ GroupId, нет экземпляров группы. Только закрытые группы и OpenGroups.
Я предполагаю, что пользователь создан и возвращен вам, но исключение находится в последней строке с '_userManager.AddClaimAsync'. Запустите отладчик и осмотрите объект 'user' после запуска' _userManager.CreateAsync'. Является ли свойство ID заполнено? – trailmax
@trailmax Пользователь действительно был создан и вернулся. Поле Id имеет следующее значение: «e8d2a128-08de-4520-95f4-75ede1a51c1c», поэтому я предполагаю, что он был успешно заполнен. – Tumladhir
Очевидно, когда я добавляю UserName в ApplicationUser, конфликт разрешается. Однако появились новые странные конфликты. Обновление вопроса. – Tumladhir