UpdateWithChildren sqlite-net-extensions

时间:2015-12-19 15:52:40

标签: sqlite-net-extensions

我对UpdateWithChildren和InsertOrReplaceWithChildren感到困惑 我无法使用UpdateWithChildren,但它可以与InsertOrReplaceWithChildren一起使用。
所以我删除了数据库,然后应用InsertOrReplaceWithChildren,但问题是Id是AutoIncrement,Id继续添加。
你能给我一些建议吗? 感谢。

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

1 个答案:

答案 0 :(得分:1)

我的第二个样本没有看到问题。您正在删除之前的DayHistory并插入新的,因此ID会有所不同,但没有什么可担心的。

关于您的第一个问题,UpdateWithChildren更新数据库中已存在的寄存器。如果在父对象上调用UpdateWithChildren,则子项(在这种情况下为DayHistory)不会被插入数据库。由于您没有分配任何主键,因此更新子项不会起作用,因此数据库也无法更新它们。

此处更简单的解决方案是首先在数据库中插入元素,然后调用UpdateWithChildren来更新外键:

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