SQLite-Net Extension и отношения один-к-одному и один-ко-многим между двумя сущностями
Я использую SQLite-Net PCL вместе с расширениями SQLite-Net для разработки приложения с использованием Xamarin.
В моей модели у меня есть две сущности, назовем их A и B, которые связаны отношениями "один к одному" и "один ко многим". Например, A имеет отношение один-к-одному с B, а A также имеет отношение один-ко-многим с B.
Можно ли выразить такое поведение с помощью расширений SQLite-Net?
1 ответ
Да, но вы должны явно объявить внешние ключи и обратные свойства в атрибуте отношения, потому что в противном случае библиотека может получить неправильный внешний ключ для отношения.
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; }
}