如何使用Sqlite Extensions创建OneToOne关系

时间:2014-11-06 16:19:17

标签: sqlite xamarin mvvmcross sqlite-net-extensions

基本上我有一个Client类和一个Address类,如下所示

public class Client
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Description{ get; set; }
    public string Email { get; set; }
    public string Website { get; set; }
    public string PhoneNumber { get; set; }

    [ForeignKey(typeof(Address))]
    public int AddressId { get; set;}
    [OneToOne(CascadeOperations = CascadeOperation.All)]
    public Address Address { get; set; }
}

public class Address
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Line1 {get;set;}
    public string Line2 {get;set;}
    public string Line3 {get;set;}
    public string Line4 {get;set;}
    public string Line5 {get;set;}
    public string Line6 {get;set;}
}

我使用nuget包SQLite.Net-PCL与SQLite.Net-PCL Extensions结合使用,这样我基本上可以调用Insert并传递Client对象来保存客户端,完成他们的地址,到数据库。像这样:

_db.InsertWithChildren(clientObject);

在我的应用程序(Xamarin.iOS和MvvmCross)中,我已经将一个预先存在的数据库与应用程序捆绑在一起,因此我不会在代码中创建表,因此我的失败点在于InsertWithChildren(clientObject)调用。

我尝试删除预先存在的表,然后在代码中创建表,首先在Address表中创建表,然后在Client创建表,但在创建Client表时,它会告诉我它#34 ;不知道"关于Address类型/属性。如果您先尝试Client表,则会出现同样的错误。我已尝试尽可能多的变体,只需在一次通话中使用地址保存客户端,但无济于事。

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

问题引发,因为所有关系属性都继承自SQLite-Net Ignore属性。如果您使用不同的SQLite-Net版本,它将无法识别Ignore属性,它将尝试保留带注释的属性,导致它因您看到的错误而崩溃。

长话短说:你可能正在使用一个SQLite-Net Extensions的注释和另一个SQLite-Net版本的数据库连接。

如果您使用的是SQLite-Net MvvmCross社区版,则必须使用SQLite-Net Extensions MvvmCross NuGet package,而不是PCL版。