J'ai installé le package SQLite-Net Extensions dans mon projet Xamarin.Android dans Visual Studio 2015 et j'essaie d'en implémenter plusieurs -to-many relation entre Person
et Event
entités. J'ai suivi the official documentation of the library, mais je ne peux pas le faire fonctionner.Xamarin.Android: SQLite-Net Extensions many-to-many - aucune table de ce type, collection NULL
classes I créé:
Person.cs:
[Table("People")]
public class Person
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string Email { get; set; }
[ManyToMany(typeof(PersonEvent), CascadeOperations = CascadeOperation.All)]
public List<Event> Events { get; set; }
}
Event.cs:
[Table("Events")]
public class Event
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
public DateTime Date { get; set; }
public string Place { get; set; }
[ManyToMany(typeof(PersonEvent), CascadeOperations = CascadeOperation.All)]
public List<Person> Participants { get; set; }
}
PersonEvent.cs:
public class PersonEvent
{
[ForeignKey(typeof(Person))]
public int PersonId { get; set; }
[ForeignKey(typeof(Event))]
public int EventId { get; set; }
}
Pour le tester, je supprimer le fichier de base de données pour être sûr un propre est créé sur le périphérique, puis essayer de créer un Person
, un Event
, insérez les deux dans le DB d'abord, puis attribuer le Event
à le Person
et d'enregistrer à nouveau en utilisant la méthode UpdateWithChildren
:
var dbFile = new File(Constants.DbFilePath);
dbFile.Delete();
var db = new SQLiteConnection(new SQLitePlatformAndroid(), Constants.DbFilePath);
db.CreateTable<Person>();
db.CreateTable<Event>();
db.CreateTable<PersonEvent>();
var event1 = new Event
{
Name = "Volleyball",
Date = new DateTime(2017, 06, 18),
Place = "Sports hall"
};
var person1 = new Person
{
Name = "A",
LastName = "B",
PhoneNumber = "123456789"
};
db.Insert(person1);
db.Insert(event1);
person1.Events = new List<Event> { event1 };
db.UpdateWithChildren(person1);
tout d'abord, je besoin d'ajouter CreateTable<PersonEvent>()
ligne parce que si elle était pas présent, je recevais l'exception: SQLite.Net.SQLiteException: no such table: PersonEvent
, mais je pensais que je n'ai pas créez cette table intermédiaire manuellement. SQLite-Net Extensions ne devrait-il pas le créer automatiquement?
Avec cette ligne ajoutée, les deux premières insertions de event1
et person1
fonctionnent correctement (après l'insertion des ID des deux entités). La collection Events
sur person1
a même le Event
créé, qui a également mis en Id:
Cependant, la "entité opposée", dans ce cas event1
a sa collection Participants
(Liste des Person
) NULL
:
J'ai tout essayé et rien ne fonctionne. Comme je l'ai compris en lisant les documents SQLite-Net Extensions, il devrait être résolu automatiquement. J'ai même ajouté ce CascadeOperations = CascadeOperation.All
sur les collections, mais cela n'aide pas comme vous pouvez le voir. Je fais encore quelque chose de mal?
Que se passe-t-il lorsque vous recevez une personne ou un événement de la base de données? –
@ShawnKendrot Je viens d'essayer et quand je reçois les entités après le code que j'ai posté en utilisant par exemple pour Person: db.Get (1), les deux collections ('Events' dans' Person' et 'Participants' dans' Event ') sont' NULL'. –
DawidSibinski
@ShawnKendrot J'ai essayé et ça ne change rien. J'ai essayé de faire une seule opération en utilisant 'db.InsertWithChildren (person1)' (sans ces deux 'Insert's individuels avant), mais cela ne change rien. – DawidSibinski