У меня есть коллекция свойств аренды, каждая из которых имеет кучу прикрепленных к ним изображений (в качестве дочернего объекта). Я использую EF 4.0 с базой данных sql ce, и мне нужно убрать все свойства и изображения из базы данных. Вот код, я использую:Ошибка свойств внешних ключей
private void SaveProperty()
{
try
{
if (PropertyList != null)
{
//Purge old database
IList<Property> ClearList = new List<Property>(from property in entities.Properties.Include("Images") select property);
foreach (Property a in ClearList)
{
if (a != null)
{
if (a.Images.Count != 0)
{
Property property = entities.Properties.FirstOrDefault();
while (property.Images.Count > 0)
{
var image = property.Images.First();
property.Images.Remove(image);
entities.DeleteObject(image);
}
entities.SaveChanges();
}
entities.DeleteObject(a);
entities.SaveChanges();
}
}
foreach(Property p in PropertyList.ToList())
{
//Store sort (current position in list)
p.Sort = PropertyList.IndexOf(p);
entities.AddToProperties(p);
entities.SaveChanges();
}
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
}
Я получаю эту ошибку: Операция не удалась: Отношения не могут быть изменены, так как один или несколько внешних ключей свойств не является обнуляемым. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.
Он ссылается на команду SaveChanges() прямо после цикла foreach Image. Любые идеи, почему я это понимаю?
EDIT:
Это старый код, который работал отлично под моей старой структуры программы (без MVVM).
private void DeleteProperty()
{
if (buttonPres.IsChecked == false)
{
//Perform parts of DeleteImage() method to remove any references to images (ensures no FK errors)
Property p = this.DataContext as Property;
if (p == null) { return; }
MessageBoxResult result = System.Windows.MessageBox.Show(string.Format("Are you sure you want to delete property '{0}'?\nThis action cannot be undone.", p.SaleTitle), "Confirm Delete", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
try
{
int max = listBoxImages.Items.Count;
for (int i = 0; i < max; i++)
{
Image img = (Image)listBoxImages.Items[0];
entities.DeleteObject(img);
entities.SaveChanges();
}
entities.DeleteObject(p);
entities.SaveChanges();
BindData();
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
Примечание: Binddata() просто обновляет список свойств.
Можете ли вы добавьте коды классов сущности здесь ..? –
Возможный дубликат [Отношения не могут быть изменены, поскольку одно или несколько свойств внешнего ключа не имеют значения null) (http://stackoverflow.com/questions/5538974/the-relationship-could-not-be-changed -because-one-or-more-of-the-foreign-key-pro) –
Его просто два простых класса сущностей, один для свойства и один для изображения. Свойство может иметь 1 * много изображений. Каждое изображение имеет только одно свойство. Для создания свойства его просто entity.property.add (новое свойство); Для изображений я делаю CurrentProperty.Images.Add (новое изображение). – randomalbumtitle