UpdateWithChildren не обновляет отношения списков (OneToMany)

Вот пример кода для воспроизведения проблемы:

Класс клиентов

public class Customer
{
    private int _id;

    [Column("_id"), PrimaryKey, AutoIncrement]
    public int Id
    {
        get { return _id; }
        set
        {
            if (value != _id)
            {_id = value;}
        }
    }

   private string _name;

   [Column("_name")]
   public string Name
   {
       get { return _name; }
       set
       {
           if (value != _name)
           {_name = value;}
       }
   }

   private List<Order> _orders;
   [OneToMany(CascadeOperations = CascadeOperation.CascadeInsert | CascadeOperation.CascadeRead | CascadeOperation.CascadeDelete)]
   public List<Order> Orders
   {
       get { return _orders; }
       set
       {
           if (_orders != value)
           {
               _orders = value;
           }
       }
   } 

Класс заказа

public class Order
{
    private int _id;

    [Column("_id"), PrimaryKey, AutoIncrement]
    public int Id
    {
        get { return _id; }
        set
        {
            if (value != _id)
                _id = value;
        }
    }

    private string _name;

    [Column("_name")]
    public string Name
    {
        get { return _name; }
        set
        {
            if (value != _name)
                _name = value;
        }
    }

    private int _customerId;

    [Column("_customerId"), ForeignKey(typeof(Customer))]
    public int CustomerId
    {
        get { return _customerId; }
        set
        {
            if (value != _customerId)
                _customerId = value;
        }
    }
}

Операции с БД

Customer customer = new Customer(){Name = "Customer One"};
context.InsertWithChildren(customer, true);
customer.Orders = new List<Order>();
customer.Orders.Add(new Order(){Name="Sample order"});
context.UpdateWithChildren(customer);

// get a new copy from the db
var result = context.GetWithChildren<Customer>(customer.Id,true); 

List<Order> orders = result.Orders; // Orders.Count is 0

Я что-то не так делаю или UpdateWithChildren так и должно работать?

ИЗМЕНИТЬ

Похоже, UpdateWithChildren не вставляет новый Order, если его нет в БД. Сначала вставляя заказ, присваивая его покупателю, а затем вызывая UpdateWithChildren, устанавливается связь.

Customer customer = new Customer(){Name = "Customer One"};
context.InsertWithChildren(customer, true);

List<Order> newOrders = new List<Order>();
newOrders.Add(new Order(){Name="Test order"});
context.InsertAllWithChildren(newOrders,true);

customer.Orders = newOrders;

context.UpdateWithChildren(customer);

var result = context.GetWithChildren<Customer>(customer.Id,true);

List<Order> orders = result.Orders; // Orders.Count is 1

Я полагаю, это то, как я должен это сделать?


person Ertay Shashko    schedule 17.01.2015    source источник


Ответы (1)


Как вы уже заметили, UpdateWithChildren не вставляет в базу данных никаких новых объектов. Он просто обновляет отношения. Если вы хотите вставить или обновить объекты, вы можете использовать InsertOrReplaceWithChildren или сначала вставить объекты, а затем обновить отношения.

В качестве альтернативы вы можете использовать рекурсивные операции вставки:

Customer customer = new Customer(){
    Name = "Customer One",
    Orders = new List<Order>{ new Order(){ Name="Test order" } }
};

// Recursively insert 'customer' and all its orders
context.InsertWithChildren(customer, true);
person redent84    schedule 18.01.2015
comment
есть ли причина, по которой вы еще не добавили такую ​​​​функциональность? (если UpdateWithChildren не находит дочерние элементы в БД, вставьте их тогда?) InsertOrReplace в порядке, но сначала все стирает, а затем записывает все снова, что вызывает проблемы с производительностью. - person Ertay Shashko; 19.01.2015
comment
Расширения SQLite-Net не являются полнофункциональным ORM и не отслеживают измененные или вставленные объекты. Обязанностью пользователя является отслеживание этих изменений, поэтому UpdateWithChildren, вставляющий объекты в базу данных, будет выполнять те же операции, что и InsertOrReplaceWithChildren. - person redent84; 19.01.2015