SQLite-Net扩展两个实体之间的一对一和一对多关系

时间:2015-03-12 08:19:40

标签: sqlite xamarin sqlite-net sqlite-net-extensions

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

在我的模型中,我有两个实体,让我们称它们为A和B,它们通过一对一和一对多的关系连接起来。例如,A与B具有一对一的关系,而A与B具有一对多的关系。

是否可以使用SQLite-Net扩展表达此类行为?

1 个答案:

答案 0 :(得分:12)

是的,但是你必须在关系属性中显式声明外键和反向属性,否则库可能会得到错误的关键外键。

public class ClassA
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [OneToMany("O2MClassAKey", "BObjectsInverse")]
    public List<ClassB> BObjects { get; set; }

    [OneToOne("O2OClassAKey", "BObjectInverse")]
    public ClassB BObject { get; set; }

    // Other properties
    public string Bar { get; set; }
}

public class ClassB
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof (ClassA))]
    public int O2MClassAKey { get; set; }

    [ForeignKey(typeof (ClassA))]
    public int O2OClassAKey { get; set; }

    // Inverse relationships, these are optional
    [ManyToOne("O2MClassAKey", "BObjects")]
    public ClassA BObjectsInverse { get; set; }
    [OneToOne("O2OClassAKey", "BObject")]
    public ClassA BObjectInverse { get; set; }

    // Other properties
    public string Foo { get; set; }
}

请注意,O2OClassAKey关系的外键OneToOne可以在任何类中声明。

如果您不需要反向属性,可以在关系属性中跳过它们:

public class ClassA
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [OneToMany("O2MClassAKey")]
    public List<ClassB> BObjects { get; set; }

    [OneToOne("O2OClassAKey")]
    public ClassB BObject { get; set; }

    // Other properties
    public string Bar { get; set; }
}

public class ClassB
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof (ClassA))]
    public int O2MClassAKey { get; set; }

    [ForeignKey(typeof (ClassA))]
    public int O2OClassAKey { get; set; }

    // Other properties
    public string Foo { get; set; }
}