2009-07-21 10 views
2

Je suis nouveau à Subsonic, et il semble que je ne peux pas trouver une façon naturelle de faire des opérations CRUD en utilisant les classes de modèle LINQ. Je suppose que ActiveRecord, vous pouvez:Subsonic 3, comment CRUD en utilisant LinqTemplates?

Product p = new Product(); 
p.ProductCode = "xxx"; 
p.Add(); 

Utilisation du produit LINQTemplate cours cependant, comment puis-je faire la même chose? Je ne peux utiliser quelque chose comme ceci ci-dessous pour insérer un objet produit:

db.Insert.Into<UnleashedSaaS.PRODUCT>(prod => prod.Code, prod => prod.Description).Values("Product1", "Product1 Desc").Execute(); 

Qui pourrait me donner quelques indices? Je l'apprécierais vraiment.

+0

+1. J'ai essayé de comprendre la même chose toute la matinée. Je ne vois pas pourquoi ce n'est pas intégré et facile à faire. Il semble qu'ActiveRecord soit beaucoup plus complet que les trucs de Linq. – CodingWithSpike

Répondre

2

Tous les CRUD se produisent dans SubSonicRepository, dont vous pouvez dériver. Par exemple, j'aurais une classe comme ceci:

public class ProductRepository : SubSonicRepository<Product> { 

    public ProductRepository() : base(new NorthwindDB()) { } 

    // need this here because base doesn't expose the DB class that I know of 
    protected NorthwindDB _db; 
    protected NorthwindDB DB { 
     get { 
      if (_db == null) _db = new NorthwindDB(); 
      return _db; 
     } 
    } 

    public void Save(Product product) { 
     if (product.ProductId == 0) { 
      Add(product); // Add is part of SubSonicRepository 
     } else { 
      Update(product); 
     } 
    } 

    public void Delete(Product product) { ... } 

    public List<Product> ListAll() { 
     var products = from p in DB.Products 
         select p; 

     return products.ToList(); 
    } 

    public Product GetById(int id) { 
     return DB.GetByKey(id); 
    } 
} 

Et ainsi de suite. C'est bien parce que vous pouvez consolider toutes vos méthodes d'accès aux données en un seul endroit. Si vous avez Sprocs, ils sont également générés en tant que méthodes sur DB. Lorsque j'aurai le temps, je vais travailler directement sur l'ajout d'une méthode Save à SubSonicRepository, donc vous n'avez pas à faire vous-même la vérification pour voir quelle méthode (Add ou Update) appeler.

0

J'ai modifié le fichier Classes.tt pour inclure:

public partial class <#=tbl.ClassName#>Repository : SubSonicRepository<<#=tbl.ClassName#>> 
    { 
     public <#=tbl.ClassName#>Repository() : base(new <#=DatabaseName#>DB()) { } 
    } 

Insérer cette bande de lignes entre

<# foreach(Table tbl in tables){#> 

et

/// <summary> 

droite en haut, près de la déclaration d'espace de noms, dans mon dossier, il peut être inséré dans la ligne 18.

La dernière chose à faire est d'ajouter une autre instruction "using", à la ligne 10, la ligne suivante après l'instruction System.Linq. Maintenant, il devrait ressembler à:

using System.Linq; 
using SubSonic.Repository; 

Cela va générer un dépôt pour vous donner accès à des fonctionnalités de base, mais peut être modifié dans une autre classe partielle.

Espérons que cela aide.