2011-03-14 3 views
1

J'essaie d'écrire une méthode générique pour insérer un objet en tant que document incorporé. Le code ci-dessous fonctionne déjà mais je dois faire une méthode générique qui peut être mise dans un référentiel et appelée depuis le contrôleur. Je dois passer l'ID racine et l'objet sous-document qui doit être inséré.Aide avec une méthode d'insertion LINQ générique (Norm/MongoDB)

class Post 
{ 
    ... 
    public IList<Comment> Comments { get; set; } 
} 

using (var db = Mongo.Create(session.ConnectionString())) 
{ 
    IMongoCollection<Post> _collection = db.GetCollection<Post>("Post"); 
    var comment = new Comment(); 
    comment.InjectFrom(commentViewModel.comment); 

    // Use below to add *NEW* embedded document 
    _collection.UpdateOne(
     new { _id = commentViewModel.Id }, 
     new { Comments = M.AddToSet(comment) } 
     ); 
} 

À titre d'exemple, voici ce que je l'utilise pour récupérer un document, je cherche quelque chose de similaire à insérer:

// Controller 
var session = new MongoSession(); 
var post = session.Single<Post>(c => c.Id == id); 

//Repository 
public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    T retval = default(T); 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     retval = db.GetCollection<T>().AsQueryable() 
        .Where(expression).SingleOrDefault(); 
    } 
    return retval; 
} 

MISE À JOUR

Notez que l'appel:

_collection.UpdateOne(
      new { _id = commentViewModel.Id }, 
      new { Comments = M.AddToSet(comment) } 
      ) 

fait ce dont j'ai besoin, je veux juste être en mesure de m Ake un appel générique (par manque d'un meilleur mot) à quelque chose comme ça (à l'exception d'une version de travail):

//Controller 
var session = new MongoSession(); 
session.AddSubDocument<>(new Post { Id = commentViewModel.Id }, new { Comments = M.AddToSet(comment) }); 

// Repository ==> NOT WORKING SAMPLE 
public void AddSubDocument<X, U>(X matchDocument, U valueDocument) 
{ 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     db.GetCollection<X>().UpdateOne(matchDocument, valueDocument); 
    } 
} 

espoir qui fait plus de sens.

Merci, Mike

Répondre

1

Cela devrait fonctionner

public void Insert<T>(T entity) 
{ 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     var collection = db.GetCollection<T>(); 
     collection.Save(entity); 
    } 
} 
+0

Merci jfar mais cela ne fonctionne que pour l'insertion d'un document, pas l'ajout d'un document incorporé dans un existant. – Mikalee

+0

@Mikalee - C'est probablement impossible sans une réflexion magique. Comment sauriez-vous quel champ ou quelle propriété ajouter le document imbriqué? – jfar

+0

Si vous regardez l'exemple que j'ai donné ci-dessus, cela fonctionne déjà, je ne sais pas comment le rendre générique. Ainsi, en appelant _collection.UpdateOne (new {_id = commentViewModel.Id}, new {Commentaires = M.AddToSet (comment)}); le premier paramètre identifie le document racine et le deuxième paramètre identifie le champ (IList Comments) auquel l'ajouter. La méthode "M.AddToSet" fait ce dont j'ai besoin - j'ajouterai quelques détails à mon article. – Mikalee