2015-04-27 2 views
0
public class Person { 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [ManyToMany(typeof(PersonColor), CascadeOperations = CascadeOperation.All)] 
    public List<Color> FavoriteColors { get; set; } 
} 

public class Color { 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [ManyToMany(typeof(PersonColor))] 
    public List<Person> People { get; set; } 
} 

public class PersonColor { 
    [ForeignKey(typeof(Person))] 
    public int PersonId { get; set; } 

    [ForeignKey(typeof(Color))] 
    public int ColorId { get; set; } 
} 

...Beaucoup de nombreuses relations avec les tables de consultation

var person = new Person() { 
    FirstName = "Adrian", 
    LastName = "Simbulan", 
    FavoriteColors = new List<Color>() { 
     new Color() {Name = "Red"}, 
     new Color() {Name = "Green"} 
    } 
}; 

await _db.InsertWithChildrenAsync(person); 

Ok donc je suis en train d'établir une relation plusieurs à plusieurs entre personne et couleur. La table de couleurs sera pré-remplie avec des données statiques.

Maintenant, le problème est que chaque fois que j'exécute la commande "InsertWithChildrenAsync", il insère toujours de nouvelles données dans la table de recherche de couleurs. Est-il possible d'insérer un enregistrement de personne avec des couleurs sélectionnées sans affecter la table de couleurs?

Répondre

1

Essayez de supprimer l'opération en cascade d'écriture à partir FavoriteColors attribut:

[ManyToMany(typeof(PersonColor), CascadeOperations = CascadeOperation.CascadeRead)] 
public List<Color> FavoriteColors { get; set; } 

De cette façon, la bibliothèque ne sera pas effectuer des opérations d'écriture récursives sur cette table.


Une autre manière sans modifier la relation consiste à effectuer une opération en deux étapes. Insérant d'abord l'objet puis mettre à jour la relation:

await _db.InsertAsync(person); 
await _db.UpdateWithChildrenAsync(person); 

Dans les deux cas, les objets de la liste FavoriteColors devraient déjà exister dans la base de données et devrait avoir une clé primaire valide assignée. D'après cela, votre exemple de code ne fonctionnera jamais car l'identificateur est 0 dans tous les objets Color.

+0

Modification de CascadeOperations pour lire simplement travaillé. L'exécution de l'opération en deux étapes serait-elle plus courante lors de l'insertion de nouveaux enregistrements dans une table ayant une relation avec une table de recherche? – ad0ran

+0

L'opération en deux étapes est ce que la bibliothèque fait en interne. La deuxième solution ne nécessite pas de modifier la définition du modèle si vous avez besoin d'opérations d'écriture récursives ailleurs. Si ce n'est pas nécessaire, respectez la première solution pour éviter d'écrire des objets 'Color' par erreur. – redent84