asp.Net Оператор обновления отношения «один ко многим» ядра конфликтует с ограничением ВНЕШНЕГО КЛЮЧА

#c# #asp.net-core #.net-core #entity-framework-core #one-to-many

#c# #asp.net-core #.net-core #entity-framework-core #один ко многим

Вопрос:

Я использую ядро Entity Framework и создал связь «один ко многим» между 2 таблицами:

 public class Fgf
  {
     public int FgfID { get; set; }

    public string FGFName { get; set; }
    ...
    public ICollection<ApplicationUser> ApplicationUsers { get; set; }

}


 public class ApplicationUser : IdentityUser
    {
    public string FirstName { get; set; }
    public string LastName { get; set; }
...
}
 

В этом случае EFCore автоматически добавляет столбец FgfID в ApplicationUser, но я не могу получить к нему доступ в контроллере.

Я пытаюсь добавить FgfID в ApplicationUser

  public class ApplicationUser : IdentityUser
    {
    public string FirstName { get; set; }

    public string LastName { get; set; }
...

   public int FgfID { get; set; }
   public Fgf Fgf { get; set; }
}
 

У меня есть форма, в которой я создаю FGF и назначаю ему пользователя со списком выбора. Я использую простую форму с действием POST. Я не использую model для формы, поскольку у меня есть другая форма на этой странице Razor.

В контроллере у меня есть:

   [HttpPost]
  public async Task<IActionResult> NewFgf(string FGFName, string ApplicationUser)
    {
        if (ModelState.IsValid) {
            var fgf = new Fgf
            {
                FGFName = FGFName,                    
            };

            var usertoupdate = await _context.Users
                .Where(c=> c.Id == ApplicationUser)
                .SingleOrDefaultAsync();

            usertoupdate.FgfID = fgf.FgfID;
            
            _context.Users.Update(usertoupdate);
            _context.Add(fgf);             
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));              
        }

        return View();
    }
 

Ошибка, которую я получаю,:

Исключение SQLException: оператор ОБНОВЛЕНИЯ конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK_AspNetUsers_Fgf_FgfID». Конфликт произошел в базе данных «aspnet-StreamPixelVer2-3E2C2112-15B8-48A4-8619-4773C5ADBFBD», таблица «dbo.Fgf», столбец «FgfID». Оператор был завершен.

Что я делаю не так? Как лучше всего сохранять данные в БД с отношением «многие к одному», «один ко многим» с Asp.net Ядро?

Комментарии:

1. добавить fgf перед обновлением?

Ответ №1:

Поскольку у вас нет fgf.FgfID, попробуйте это:

 using Microsoft.EntityFrameworkCore.ChangeTracking;

.....
....

var usertoupdate = await _context.Set<ApplicationUser>()
                .Where(c=> c.Id == applicationUser.Id)
                .SingleOrDefaultAsync();

      var fgf = new Fgf
            {
                FGFName = FGFName,                    
            };  
        

  fgf.ApplicationUsers = new ObservableCollectionListSource<ApplicationUser>();
  fgf.ApplicationUsers.Add(usertoupdate);  
    _context.Set<Fgf>().Add(fgf);
   await _context.SaveChangesAsync();
 

Комментарии:

1. ObservableCollectionListSource — не удалось найти тип или имя пространства имен ‘ObservableCollectionListSource<>’.

2. Извините за опечатку. Я только что обновил ответ

3. Попробуйте добавить с помощью Microsoft. EntityFrameworkCore. Пространство имен отслеживания изменений

4. Как я могу создать запрос для выбора всех пользователей, которым не был назначен fgf. Поскольку я все еще не могу получить доступ к столбцу FgfID в сущности ApplicationUsers, мой запрос показывает ошибку. Вот запрос: ` return Json(_context. Пользователи. Выберите (u => new { userId = u.Id , LastName = u.LastName, FirstName = u.FirstName, userEmail = u.Email}) . OrderBy(o => o.userEmail) . Где( f => f.FgfID==null ) . ToList()); `

5. попробуйте _context.Set<ApplicationUser>().Где( u => u.FgfID==null ). Выберите (u => new { userId = u.Id , LastName = u.LastName, FirstName = u.FirstName, userEmail = u.Email}). OrderBy(o => o.userEmail). toArray(); — @Aram