2012-04-18 1 views
0

У меня есть коллекция свойств аренды, каждая из которых имеет кучу прикрепленных к ним изображений (в качестве дочернего объекта). Я использую 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() просто обновляет список свойств.

+0

Можете ли вы добавьте коды классов сущности здесь ..? –

+1

Возможный дубликат [Отношения не могут быть изменены, поскольку одно или несколько свойств внешнего ключа не имеют значения null) (http://stackoverflow.com/questions/5538974/the-relationship-could-not-be-changed -because-one-or-more-of-the-foreign-key-pro) –

+0

Его просто два простых класса сущностей, один для свойства и один для изображения. Свойство может иметь 1 * много изображений. Каждое изображение имеет только одно свойство. Для создания свойства его просто entity.property.add (новое свойство); Для изображений я делаю CurrentProperty.Images.Add (новое изображение). – randomalbumtitle

ответ

0

Моя ставка удалить сохранить изменения после удаления изображений, если это соотношение 1-много вы будете сохранять изменения в состоянии, которое нарушает эту взаимосвязь

попробовать:

 //Purge old database     
    foreach (Property a in entities.Properties) 
    { 
     if (a != null) 
     { 
      if (a.Images != null) 
      { 
       foreach (Image i in a.Images) 
       { 
        entities.Images.DeleteObject(i); 
       } 
      } 
      entities.Properties.DeleteObject(a); 
     } 

    } 
    entities.SaveChanges(); 
+0

Свойство images может быть установлено равным нулю, поэтому я не думаю, что это проблема (т. Е. Отношение состоит в том, что свойство может иметь много изображений или нет). Извините, что я раньше этого не делал. – randomalbumtitle

+0

Вы уверены? это не то, о чем говорит ошибка. –

+0

Это мой код для всего метода. В основном я общаюсь с базой данных с моей модели просмотра, так как программа недостаточно велика, чтобы гарантировать отдельный datalayer. Эта команда просто направлена ​​на удаление всех существующих данных в базе данных и повторение ее с помощью данных наблюдаемого коллекционирования. Он не работает в тот же момент, когда я добавляю изображение в свойство, сохраняю его в базе данных, но потом удаляю это свойство и сохраняю изменения. – randomalbumtitle