2017-07-29 1 views
0

J'ai décidé d'implémenter une base de données dans Xamarin.Android qui stocke les données sur l'appareil et les obtient très occasionnellement du serveur. Quoi qu'il en soit, je voulais créer une base de données à partir de zéro si elle ne stocke aucune table. Mon problème est que j'ai des modèles qui sont utilisés pour créer de nouvelles tables, mais ces modèles sont connectés par relation plusieurs-à-plusieurs avec eux-mêmes et cela bloque la transaction lors de la première tentative de création de table.Créer une table many-to-many dans les crashs du constructeur car la deuxième table n'a pas encore été créée

Je sais que c'est lié à des contraintes mais je n'ai aucune idée de comment refactoriser l'application pour éviter cela. Je n'ai pas pu trouver de réponse à ce sujet directement.

Des pensées?

class Database 
{ 
    private SQLiteConnection _connection; 

    public Database() 
    { 
     _connection = new SQLite().GetConnection(); 
     LogHelper.CustomLog("SQL Created"); 
     _connection.BeginTransaction(); 
     _connection.CreateTable<Dish>(); //there is the issue 
     _connection.CreateTable<Ingredient>(); 
     _connection.Commit(); 
     LogHelper.CustomLog("SQL DBs created"); 

     AddIngredient(new Ingredient() { Id = 1, Name = "apple", Vegetarian = false, GlutenFree = false }); 
     AddDish(new Dish() { Id = 1, Calories = "23", Desc = "test", Name = "oranges", Time = 30, Ingredients = GetIngredientList() }); 
    } 
} 


public class Dish 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Desc { get; set; } 
    public int Time { get; set; } 
    //public string Rating { get; set; } 
    public string Calories { get; set; } 

    [ForeignKey(typeof(Ingredient))] 
    public int IngredientId { get; set; } 
    [ManyToMany(typeof(Dish))] 
    public List<Ingredient> Ingredients { get; set; } 

    public override string ToString() 
    { 
     return string.Format("[Dish: Id={0}, Name={1}, Desc={2}, Time={3}, 
Ingredients={4}, Calories={6}]", 
      Id, Name, Desc, Time, Ingredients, Calories); 
    } 
} 

public class Ingredient 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Vegetarian { get; set; } 
    public bool GlutenFree { get; set; } 

    [ForeignKey(typeof(Dish))] 
    public int DishId { get; set; } 
    [ManyToMany(typeof(Ingredient))] 
    public List<Dish> Dishes { get; set; } 
} 

Répondre

0

Découvrez SQLite-Net extensions pour beaucoup de nombreuses relations.

Citations de la documentation:

De nombreux à plusieurs relations ne peuvent être exprimées à l'aide d'une clé étrangère dans l'une des entités, parce que les clés étrangères représentent X à un relations. Au lieu de cela, une entité intermédiaire est requise. Cette entité n'est jamais utilisée directement dans l'application, mais pour la clarté , les extensions SQLite-Net ne créeront jamais une table que l'utilisateur n'a pas définie explicitement.

0

En utilisant la relation Many-To-Many, vous avez besoin d'une entité intermédiaire.

Essayez de définir vos entités comme ceci:

public class Dish 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Desc { get; set; } 

    public int Time { get; set; } 

    //public string Rating { get; set; } 

    public string Calories { get; set; } 

    [ManyToMany(typeof(DishIngredients))] 
    public List<Ingredient> Ingredients { get; set; } 

    public override string ToString() 
    { 
     return string.Format("[Dish: Id={0}, Name={1}, Desc={2}, Time={3}, 
Ingredients={4}, Calories={6}]", 
      Id, Name, Desc, Time, Ingredients, Calories); 
    } 
} 

public class Ingredient 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public bool Vegetarian { get; set; } 

    public bool GlutenFree { get; set; } 

    [ManyToMany(typeof(DishIngredients))] 
    public List<Dish> Dishes { get; set; } 
} 

public class DishIngredients 
{ 
    [ForeignKey(typeof(Dish))] 
    public int DishId { get; set; } 

    [ForeignKey(typeof(Ingredient))] 
    public int IngredientId { get; set; }  
} 
+0

Après vos modifications, je ne peux toujours pas créer des tables. https://ibb.co/gdboqQ – Perisher

+1

@Perisher cette erreur semble être liée à ce problème: https://github.com/praeclarum/sqlite-net/issues/553 – apineda