Xamarin を使用してアプリケーションを開発するために、SQLite-Net PCL を SQLite-Net 拡張機能と共に使用しています。
2 つのクラス間に 1 対多の関係があり、次のよう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(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(string name)
{
Name = name;
}
}
挿入時 (および後で更新時)とオブジェクトLastModified
の両方のフィールドを自動的に設定するためのトリガーを定義しました。問題は、 を使用すると、トリガーがアクティブにならないことですが、この場合は明らかに再帰的な挿入がありません。A
B
InsertWithChildren
Insert
問題を再現するコード例:
var sons1 = new List<B>
{
new B("uno"),
new B("due"),
new B("tre"),
};
one = new A("padre", sons1);
var sons2 = new List<B>
{
new B("uno2"),
new B("due2"),
new B("tre2"),
};
two = new A("padre2", sons2);
using (var conn = DatabaseStore.GetConnection())
{
conn.DeleteAll<A>();
conn.DeleteAll<B>();
string query = @"CREATE TRIGGER {0}_log AFTER INSERT ON {0} " +
"BEGIN " +
"UPDATE {0} SET LastModified = datetime('now') " +
"WHERE Id = NEW.Id; " +
"END;";
conn.Execute(String.Format(query, "A"));
conn.Execute(String.Format(query, "B"));
}
using (var conn = DatabaseStore.GetConnection())
{
conn.InsertWithChildren(one, true);
conn.Insert(two);
}
この例では、メソッドtwo
で挿入され、列が正しく更新されますが、で挿入されたでは発生しません。私は間違った方法で何かをしていますか?Insert
LastModified
one
InsertWithChildren