2009-05-27 6 views
0

Il y a quelques ressources sur Internet décrivant aperçu 2 subsonique Astoria:subsoniques 3 services de données alpha + ado.net des échantillons

http://theruntime.com/blogs/jaykimble/archive/2008/11/18/quotsubsonicquot-for-services-found-subsonic-3--ado.net-data-services.aspx

et de l'échantillon de travail à

http://code.msdn.microsoft.com/SubSonicForADONETDS

J'ai appliqué tous les changements respectifs à tt (s) subsonique, mais n'a pas réussi à faire le travail du projet MSDN. Après avoir éliminé:

a) Astoria n'a pas aimé privé DB() {} dans QuerySurface.tt, donc je public constructeur aveuglément fait

b) Je ne sais pas comment générer la clé primaire composé

<# if(EnableForUseWIthAstoria) { 
#> [System.Data.Services.Common.DataServiceKey("<#=pk#>")] <# }#> 

résultats dans

[System.Data.Services.Common.DataServiceKey("")] 

au lieu de

[System.Data.Services.Common.DataServiceKey("OrderID", "ProductID")] 

donc juste exclu le tableau.

L'obstacle actuel

 var q = from cust in ctx.Customers 
       where cust.CustomerID == "ROMEY" 
       select cust; 

     Customers c = q.First(); 

résultats en exception: Ressource introuvable pour le segment «Les clients de

A quelqu'un a essayé de cela ou connaît une autre la plus récente et la plus grande existence de l'échantillon?

Répondre

0

Oui, j'ai vérifié une version de ss3 avec l'interface IUpdatable, et j'ai hérité de la classe de surface de requête DB d'une classe UpdatableDatabase. J'ai également inclus un projet de test de démarrage pour cela. La bonne partie est que vous pouvez construire une classe DB avec un Uri, et commencer à travailler contre un service. Mais il ne fait pas partie du noyau actuel, il nécessite une nouvelle classe et quelques réorganisations, plus des changements mineurs de modèle. Je pense que c'est l'un de ces domaines où les gens vont continuer à réinventer cette chose et ne pas construire sur le travail précédent. Il y a plusieurs changements que j'ai voulu apporter au projet, mais ils ne le font pas, comme la configuration de plusieurs bases de données à l'exécution, les services ado.net, etc. Je pense que je devrais brancher en permanence ma propre version.

This issue possède une pièce jointe montrant la classe UpdatableDatabase.

Je a ajouté à SubSonicClasses.ttinclude:

public string PrimaryKey 
{ 
    get { return Utilities.CleanUp(this.Schema.GetTablePrimaryKey(TableSchema, TableNameRaw)); } 
} 

... 

[System.Data.Services.Common.DataServiceKey("<#=PrimaryKey #>")] 

Je vois que je triché avec les OrderDetails à Northwind et a ajouté la deuxième clé en modifiant directement le fichier. Vous pouvez facilement écrire une méthode comme celui-ci dans DatabaseSchema.ttinclude:

public string[] GetTablePrimaryKeys(string tableSchema, string tableName) 

et construire la chaîne correcte.

+0

est projet de test de démarrage disponible en téléchargement? Avez-vous fait référence à http://code.google.com/p/subsonicthree/source/browse/, je ne vois aucune branche. – MicMit

+0

Il semble avoir été complètement effacé du contrôle de la source. Je peux fournir un lien vers ma version plus tard aujourd'hui. Il a les changements de modèle, etc. –

0

Je ne sais pas si je peux compresser une solution et la distribuer parce qu'il y a une licence subsonique. Ce n'est pas subsonique, et il a environ 2 mois (dépassé). J'ai juste couru le projet pour tester qu'il fonctionnait toujours et c'est.Voici les étapes pour cela:

Utilisez la classe UpdatableDatabase mentionnée ci-dessus. Ensuite, tirer DB de celui-ci (mettre ceci dans le modèle):

public partial class DB: UpdateableDatabase

UpdatableDatabase.cs doit être avec les classes générées ou il ne fonctionnera pas, car il doit GetType() sur les classes de la table.

Le service est simplement un projet de service avec cette classe:

using System.Data.Services; 
using Northwind; 

namespace NorthwindService 
{ 
    [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
    public class Northwind: DataService<DB> 
    { 
     // This method is called only once to initialize service-wide policies. 
     public static void InitializeService(IDataServiceConfiguration config) 
     { 
      config.SetEntitySetAccessRule("*", EntitySetRights.All); 
      config.UseVerboseErrors = true; 
     } 
    } 
} 

La partie de service de web.config est facile:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    </system.serviceModel> 

Ensuite, pour le projet de test, ajoutez une référence de service à le service. Je pris le code de test du projet astoria je pense, il a été un moment:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using WcfClientTest.NorthwindService; 

namespace WcfClientTest 
{ 
    /// <summary> 
    /// Summary description for WcfTest 
    /// To run these tests, load this project, and somehow get a server running at the URI. 
    /// This can be done by updating the service reference to start the development server. 
    /// </summary> 
    [TestClass] 
    public class WcfTest 
    { 
     private string baseURI = "http://127.0.0.1:49649/Northwind.svc"; 
     private DB ctx; 

     /// <summary> 
     /// Sets up test. 
     /// </summary> 
     [TestInitialize] 
     public void SetUp() 
     { 
      ctx = new DB(new Uri(baseURI)); 
     } 

     [TestCleanup] 
     public void Cleanup() 
     { 
     } 

     [TestMethod] 
     public void Select_Simple_With_Variable() 
     { 
      int categoryID = 5; 
      IQueryable<Product> result = from p in ctx.Products 
             where p.CategoryID == categoryID 
             select p; 

      List<Product> products = result.ToList(); 
      Assert.AreEqual(7, products.Count()); 
     } 

     [TestMethod] 
     public void TestAddNew() 
     { 
      // add customer 
      var c = new Customer 
         { 
          CustomerID = "XXXXX", 
          ContactTitle = "Prez", 
          Country = "USA", 
          ContactName = "Big Guy", 
          CompanyName = "Big Guy Company" 
         }; 
      ctx.AddToCustomers(c); 
      ctx.SaveChanges(); 

      IQueryable<Customer> qCustomer = from cust in ctx.Customers 
              where cust.CustomerID == "XXXXX" 
              select cust; 

      Customer c2 = qCustomer.FirstOrDefault(); 

      Assert.AreEqual("XXXXX", c2.CustomerID); 

      if (c2 != null) 
      { 
       ctx.DeleteObject(c2); 
      } 
      ctx.SaveChanges(); 

      IQueryable<Customer> qCustomer2 = from cust in ctx.Customers 
               where cust.ContactName == "Big Guy" 
               select cust; 
      // Returns null if the row isn't found. 
      Customer c3 = qCustomer2.SingleOrDefault(); 
      Assert.AreEqual(null, c3); 
     } 
    } 
} 

C'est tout ce que je l'ai, il est difficile de ne pas mettre ensemble. En ce moment, c'est une solution à la recherche d'un problème, mais j'ai l'intention de l'utiliser un jour. Il serait possible de contourner entièrement subsonic, et utiliser le kit IQToolkit directement, et avec certains modèles T4 ont un système assez sympa.

+0

Merci pour toutes les informations. Le problème est que la vérification la plus récente de SVN ne compile pas directement, donc j'utilise alpha zip dll. On dirait que votre échantillon a utilisé des méthodes plus récentes, j'ai dû revenir en arrière ITable tbl = db.FindTable (typeof (T) .Name); // ITable tbl = db.FindTableByClassName (typeof (T) .Name); et etc ... J'ai fait tout compiler, mais la même erreur de Service de données: Ressource non trouvée pour le segment 'Clients'. Peut-être, j'attendrai qu'un autre échantillon complet apparaisse sur Internet emballé comme sln. – MicMit

+0

Il compilera, mais j'ai dû jouer avec lui pendant quelques minutes. Le 'FindTableByClassName' a été refactorisé en 'FindTable'. Je pense que vous pouvez retrouver cette erreur en utilisant le débogueur. Je comprends certainement pourquoi vous aimeriez un exemple de projet. Je peux le compresser mais je ne sais pas comment le livrer ... –

0

Voici un correctif pour l'interface IUpdatable et les modifications de modèle requises. Je suis sûr à 99% que cela n'ira pas dans le projet final, mais au moins vous pouvez voir comment je l'ai fait.

http://code.google.com/p/subsonicthree/issues/detail?id=52

+0

Par curiosité, vous avez utilisé l'échantillon original de MSDN pour UpdateableDatabase.cs et là: public abstract class UpdateableDatabase: IUpdatable, IQuerySurface alors que dans l'original: public partielle classe DB: IUpdatable était une nécessité ou un choix de conception. – MicMit

+0

Le fichier d'origine était SubSonicIUpdateable.cs. J'ai fait ce travail il y a environ 3 mois et je ne me souviens pas pourquoi je l'ai fait, mais je pense que ça marche de toute façon. Je viens de passer en revue le code aujourd'hui pour m'assurer que les tests étaient toujours en cours. J'ai un exemple d'exécution de la dernière révision subsonic3 de la tête. –

Questions connexes