Ertay Shashko
Ertay Shashko

Reputation: 1257

UpdateWithChildren not updating Lists (OneToMany) relationships

Here is some sample code to reproduce the problem:

Customer class

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;
           }
       }
   } 

Order class

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;
        }
    }
}

DB operations

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

Am I doing something wrong here or is UpdateWithChildren supposed to work like this?

EDIT

Looks like UpdateWithChildren does not insert a new Orderif one is not present in the DB. Inserting the order first, assigning it to the customer and then calling UpdateWithChildren establishes the relationship.

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

I assume this is how I am supposed to do it?

Upvotes: 2

Views: 1730

Answers (1)

redent84
redent84

Reputation: 19239

As you already noticed UpdateWithChildren doesn't insert any new objects into the database. It just updates the relationships. If you want to Insert or Update objects you can use InsertOrReplaceWithChildren or Insert first the objects and then update the relationships.

Alternatively you can use recursive insert operations:

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);

Upvotes: 7

Related Questions