2015-03-12 6 views
3

Я использую SQLite-Net PCL вместе с расширениями SQLite-Net для разработки приложения с использованием Xamarin.SQLite-Net Расширение как взаимно-однозначных, так и взаимных связей между двумя объектами

В моей модели у меня есть два сущности, назовем их A и B, которые связаны как взаимно-однозначным, так и взаимно-однозначным отношением. Например, A имеет взаимно-однозначное отношение с B, а A также имеет отношение «один ко многим» с B.

Возможно ли такое поведение с расширениями SQLite-Net?

ответ

8

Да, но вы должны явно объявить внешние ключи и обратные свойства в атрибуте взаимосвязей, потому что иначе библиотека может получить неправильный внешний ключ для отношения.

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; } 
} 
+0

Спасибо за ваш ответ @ redent84, это именно то, что я искал. Я просто не очень уверен в том, что вы подразумеваете под «внешним ключом для oneToMany отношения могут быть объявлены в любом из классов». – markusian

+1

К сожалению, это была опечатка. Я хотел сказать свойство «OneToOne». Внешний ключ отношения «один к одному» может быть в любом из двух концов. – redent84