Получение исключения "Невозможно изменить отношение, потому что одно или несколько свойств внешнего ключа не могут иметь значение NULL" при обновлении объекта
У меня есть следующие модели.
public class Site
{
public int Id { get; set; }
public string SiteName { get; set; }
public string SiteUrl { get; set; }
public IEnumerable<SiteBrand> SiteBrands { get; set; }
}
public class SiteBrand
{
public int Id { get; set; }
public int SiteId { get; set; }
public int BrandId { get; set; }
public SiteConfiguration SiteConfiguration { get; set; }
}
SiteBrand имеет внешний ключ на SiteId сайта.
Я пытаюсь обновить свой сайт таким образом.
public bool Update(Site item)
{
try
{
if (item == null)
return false;
var itemToUpdate =
_dbContext.SiteConfigurations.FirstOrDefault(ua => ua.Id == item.Id);
if (itemToUpdate == null)
return false;
itemToUpdate.SiteName = item.SiteName;
itemToUpdate.SiteBrands = item.SelectedBrands.Select(
br =>
new DataEntities.Siteconfig.SiteBrand {BrandId = br}).ToList();
_dbContext.SaveChanges(); // Save changes.
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
Но приведенный выше код вызывает следующее исключение.
Операция не выполнена: отношение не может быть изменено, так как одно или несколько свойств внешнего ключа не могут иметь значение NULL. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.
Я думаю, что получаю эту ошибку, потому что я пытаюсь обновить свой объект сайта без очистки существующих записей внешнего ключа. Я не уверен, правильно это или нет, а также я не уверен, как решить эту проблему. Может ли кто-нибудь помочь мне в этом?
Спасибо
1 ответ
Проблема в том, что вы не присваиваете значение внешнему ключу SiteId, поэтому оно будет отправлено в БД как нулевое (что не разрешено вашими отношениями с БД). Попробуйте изменить код на:
itemToUpdate.SiteBrands = item.SelectedBrands
.Select(br => new DataEntities.Siteconfig.SiteBrand
{
SiteId = item.Id,
BrandId = br
}).ToList();