tom tom
tom tom

Reputation: 29

UpdateWithChildren sqlite-net-extensions

I have confused with UpdateWithChildren and InsertOrReplaceWithChildren.
I can't get it work with UpdateWithChildren, but It can work with InsertOrReplaceWithChildren.
so I have deleted the db, then apply InsertOrReplaceWithChildren,
but the problem is that the Id is AutoIncrement, the Id keeps adding on.
Would you give me some advice?
Thanks.

public class WeekHistory {
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public DayOfWeek DayOfWeek { get; set; }
public int NoOfDays { get; set; }

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

public class DayHistory {
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public int Hour { get; set; }
public Action Action { get; set; }
public TimeSpan Duration { get; set; }

[ForeignKey(typeof(WeekHistory))]     
public int WeekId { get; set; }
[ManyToOne]      // Many to one relationship with WeekHistory
public WeekHistory WeekHistory { get; set; }}


List<DayHistory> newMonday = new List<DayHistory>()
{
    new DayHistory() {Hour = 1, Action = Action.Known, Duration = new TimeSpan(0,20,0)},
    new DayHistory() {Hour = 1, Action = Action.Unknown, Duration = new TimeSpan(0,40,0)},
    new DayHistory() {Hour = 2, Action = Action.Known, Duration = new TimeSpan(0,40,0)},
    new DayHistory() {Hour = 2, Action = Action.Unknown, Duration = new TimeSpan(0,20,0)},
    new DayHistory() {Hour = 3, Action = Action.Known, Duration = new TimeSpan(0,50,0)},
    new DayHistory() {Hour = 3, Action = Action.Unknown, Duration = new TimeSpan(0,10,0)}
};

var mondayHistory = dbConn.GetWithChildren<WeekHistory>(1, true);       

//delete the db, instead of the UpdateWithChildren
dbConn.DeleteAll(mondayHistory.DayHistories);       

mondayHistory.DayHistories = newMonday;
mondayHistory.NoOfDays += 1;

//it won't update the child
//dbConn.UpdateWithChildren(mondayHistory);

//apply new db with children
dbConn.InsertOrReplaceWithChildren(mondayHistory);

enter image description here

Upvotes: 0

Views: 1493

Answers (1)

redent84
redent84

Reputation: 19239

I don't see the issue with your second sample. You are deleting the previous DayHistorys and inserting new ones, so the Ids will be different, but nothing to worry about there.

About your first question, UpdateWithChildren updates registers that already exists in the database. If you call UpdateWithChildren on the parent object, the children (DayHistory in this case) won't be inserted into database. Updating the children won't work because you are not assigning any primary key, so the database can't update them either.

Easier solution here is just insert the elements in the database first and then call UpdateWithChildren to update the foreign keys:

// Delete previous DayHistories to avoid orphaned objects
dbConn.DeleteAll(mondayHistory.DayHistories);

// Assign new elements
mondayHistory.DayHistories = newMonday;
// Insert new elements into database
dbConn.InsertAll(mondayHistory.DayHistories);
// Update parent object to correctly assign foreign keys for the relationships
dbConn.UpdateWithChildren(mondayHistory);

Upvotes: 1

Related Questions