0

У меня есть 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.

+1

Я предполагаю, что пользователь создан и возвращен вам, но исключение находится в последней строке с '_userManager.AddClaimAsync'. Запустите отладчик и осмотрите объект 'user' после запуска' _userManager.CreateAsync'. Является ли свойство ID заполнено? – trailmax

+0

@trailmax Пользователь действительно был создан и вернулся. Поле Id имеет следующее значение: «e8d2a128-08de-4520-95f4-75ede1a51c1c», поэтому я предполагаю, что он был успешно заполнен. – Tumladhir

+0

Очевидно, когда я добавляю UserName в ApplicationUser, конфликт разрешается. Однако появились новые странные конфликты. Обновление вопроса. – Tumladhir

ответ

1

Бьюсь об заклад, этот вопрос наиболее пострадал от этой проблемы. Конфликт вызван одной или несколькими ошибками модели при попытке добавить claim. В большинстве случаев user создается успешно, но процесс добавления иска прерывается из-за ошибки модели. Во-первых, вместо огня & забыть о CreateAsync, присвоить его переменной следующим образом:

var user = await _userManager 
         .CreateAsync(superadmin, "Password"); 

Hover над user variable для определения ошибок модели, с которыми сталкиваются, как показано на рисунке ниже:

enter image description here

В моем случае я не назначил необходимое поле Email. Затем вы можете исправить ошибки модели, и конфликт исчезнет. Ура!