У меня есть две модели, называемые «Клиент» и «Программное обеспечение». Клиенты могут иметь одно и то же программное обеспечение, а программное обеспечение может быть установлено на нескольких клиентах. Я хочу добавить список программного обеспечения для конкретного клиента.
Модель клиента:
public class Client
{
[Key]
public int id { get; set; }
[Required]
public ICollection<Software>? Softwares { get; set; }
}
Программная модель:
public class Software
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
public ICollection<Client>? Clients { get; set; }
}
Почему это вызывает исключение NullReferenceException?
public void submit()
{
using (var repo = new ClientRepository(contextFactory.CreateDbContext()))
{
client = repo.getClientByID(Convert.ToInt32(clientid));
foreach (var software in toAddList)
{
client.Softwares.Add(software); //Error occurs here
}
}
}
Код репо
public Client getClientByID(int id)
{
return _context.Clients.Find(id);
}





Потому что вам нужно включить Softwares при выборке из таблицы «Клиенты» в базе данных.
В своем репо измените свой код следующим образом:
public Client getClientByID(int id)
{
return _context.Clients.Include(k => k.Softwares).Single(i => i.id == id);
}
@HenkHolterman, для меня, поскольку это уже идентификатор, я бы просто использовал First (), потому что я уверен, что в любом случае есть только данные в силу самого ограничения базы данных, нет необходимости, чтобы база данных сканировала всю таблицу, чтобы проверить любой возможный дубликат во время этого поиска данных.
Хорошо, я отредактирую свой код
Здесь два объекта могут быть null, как сам client, так и список software, Но ваша ошибка возникает из-за того, что список software есть null, для решения этой проблемы нужно подгружать список software при получении Client информации из базы данных, Но перед этим вы должны убедиться в существовании Client.
решить следующим образом:
public Client getClientByID(int id)
{
return _context.Clients.Include(s=>s.Softwares).FirstOrDefault(u => u.id == id);
}
client = repo.getClientByID(Convert.ToInt32(clientid));
if (client is null)
{
//Do somthing Like Return or throw new Exception
}
foreach (var software in toAddList)
{
client.Softwares.Add(software);
}
добавить код
repo.getClientByID(Convert.ToInt32(clientid));