Xamarin を使用してアプリケーションを開発するために、SQLite-Net PCL を SQLite-Net 拡張機能と共に使用しています。
私のモデルには、1 対 1 と 1 対多の両方の関係によって接続されている 2 つのエンティティー (A と B と呼びましょう) があります。たとえば、A は B と 1 対 1 の関係を持ち、A は B とも 1 対多の関係を持ちます。
そのような動作を SQLite-Net 拡張機能で表現することは可能ですか?
Xamarin を使用してアプリケーションを開発するために、SQLite-Net PCL を SQLite-Net 拡張機能と共に使用しています。
私のモデルには、1 対 1 と 1 対多の両方の関係によって接続されている 2 つのエンティティー (A と B と呼びましょう) があります。たとえば、A は B と 1 対 1 の関係を持ち、A は B とも 1 対多の関係を持ちます。
そのような動作を SQLite-Net 拡張機能で表現することは可能ですか?
はい。ただし、関係属性で外部キーと逆プロパティを明示的に宣言する必要があります。そうしないと、ライブラリが関係に対して間違った外部キーを取得する可能性があるためです。
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; }
}