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; }
}
Другие вопросы по тегам