2015-03-17 11 views
1

Я использую SQLite-Net PCL вместе с расширениями SQLite-Net для разработки приложения с использованием Xamarin.SQLite-Net Extensions как правильно обновлять объект рекурсивно

У меня есть один ко многим отношений между двумя классами A и B определяется следующим образом:

public class A 
{ 

    [PrimaryKey, AutoIncrement] 
    public int Id 
    { 
     get; 
     set; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<B> Sons 
    { 
     get; 
     set; 
    } 

    public A() 
    { 
    } 

    public A(string name, List<B> sons) 
    { 
     Name = name; 
     Sons = sons; 
    } 

} 

public class B 
{ 

    [PrimaryKey, AutoIncrement] 
    public int Id 
    { 
     get; 
     set; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    [ForeignKey(typeof(A))] 
    public int FatherId 
    { 
     get; 
     set; 
    } 

    [ManyToOne] 
    public A Father 
    { 
     get; 
     set; 
    } 

    public B() 
    { 
    } 

    public B(string name) 
    { 
     Name = name; 
    } 

} 

То, что я хотел бы сделать, чтобы получить объект типа A из базы данных, удалите один из объекты Sons типа B и обновить базу данных соответственно. Это то, что я пробовал:

 var sons = new List<B> 
     { 
      new B("uno"), 
      new B("due"), 
      new B("tre"), 
     }; 

     one = new A("padre", sons); 

     using (var conn = DatabaseStore.GetConnection()) 
     { 
      conn.DeleteAll<A>(); 
      conn.DeleteAll<B>(); 

      conn.InsertWithChildren(one, true); 

      A retrieved = conn.GetWithChildren<A>(one.Id); 
      retrieved.Sons.RemoveAt(1); 
     } 

     using (var conn = DatabaseStore.GetConnection()) 
     { 
      var retrieved = conn.GetWithChildren<A>(one.Id); 
      retrieved.Sons.RemoveAt(1); //"due" 

      //conn.UpdateWithChildren(retrieved); 
      conn.InsertOrReplaceWithChildren(retrieved, true); 
     } 

Проблема заключается в том, что и с UpdateWithChildren и InsertOrReplaceWithChildren объект на самом деле не удаляется из базы данных, но только это внешний ключ обнуляется. Можно ли удалить объект son?

ответ

2

Вы вообще не пытаетесь удалить какой-либо объект. Вы просто удаляете связь между двумя объектами, но ничто не мешает вам иметь больше объектов, связанных с любым из них, поэтому удаление любого из них неверно, так как вы можете разорвать другие отношения.

Это должно быть больше, как это:

using (var conn = DatabaseStore.GetConnection()) 
{ 
    var retrieved = conn.GetWithChildren<A>(one.Id); 
    var due = retrieved.Sons[1]; 

    // This is not required if the foreign key is in the other end, 
    // but it would be the usual way for any other scenario 
    // retrieved.Sons.Remove(due); 
    // conn.UpdateWithChildren(retrieved); 

    // Then delete the object if it's no longer required to exist in the database 
    conn.delete(due); 
} 
+0

Это полностью имеет смысл. Хотя хотя, возможно, объект может быть удален, когда все его внешние ключи могут быть обнулены, но, возможно, это должно быть явно указано для рассматриваемого объекта. – markusian