Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite.Net扩展触发器未使用递归插入激活_Sqlite_Xamarin_Sqlite Net_Sqlite Net Extensions - Fatal编程技术网

SQLite.Net扩展触发器未使用递归插入激活

SQLite.Net扩展触发器未使用递归插入激活,sqlite,xamarin,sqlite-net,sqlite-net-extensions,Sqlite,Xamarin,Sqlite Net,Sqlite Net Extensions,我正在使用SQLite Net PCL和SQLite Net扩展来开发使用Xamarin的应用程序 我在两个类a和B之间有一对多关系,定义如下: public class A { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Name { get; set; } [

我正在使用SQLite Net PCL和SQLite Net扩展来开发使用Xamarin的应用程序

我在两个类
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;
    }

}

在本例中,使用
Insert
方法插入的
two
将正确更新
LastModified
列,而使用
InsertWithChildren
插入的
one
则不会发生这种情况。我是不是做错事了?

递归插入最终会调用
Insert
,正如您在这里看到的:所以应该没有任何区别是的,我已经检查了源代码,这就是为什么我对这种行为感到困惑。我想可能有一些我不知道的副作用,一个建议是用模型代替触发器。为WriteOperations类创建一个包装器,用于检查对象是否实现了某些接口,例如IModifiable,并在插入之前更新日期。这可能是一种可能性,但需要更多的工作,而且它可以轻松实现为触发器,因此我支持最简单的解决方案:)好的一面是,当我在更新时添加相同的触发器时,它就开始工作了
        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);
        }