2010-04-05 7 views
6

Ho bisogno di alcuni consigli di esperti su set di dati fortemente digitati in ADO.NET generati da Visual Studio. Ecco i dettagli. Grazie in anticipo.Domanda su come utilizzare il set di dati fortemente tipizzato nell'applicazione N-tier per .NET

  • voglio scrivere un applicazione N-tier in cui livello di presentazione è in C# forme/Windows, business Layer è un servizio Web e Data Access Layer è SQL db.

  • Quindi, ho utilizzato Visual Studio 2005 per questo e ho creato 3 progetti in una soluzione.

  • progetto 1 è il livello di accesso ai dati. In questo ho utilizzato il generatore di set di dati dello studio visivo per creare un set di dati e un adattatore di tabella fortemente tipizzati (per testare l'ho creato sulla tabella dei clienti in northwind). Il set di dati è denominato NorthWindDataSet e la tabella all'interno è CustomersTable.

  • progetto 2 ha il servizio Web che espone solo 1 metodo che è GetCustomersDataSet. Questo utilizza l'adattatore da tavolo della libreria project1 per riempire il set di dati e restituirlo al chiamante. Per poter utilizzare NorthWindDataSet e l'adattatore da tavolo, ho aggiunto un riferimento al progetto 1.

  • il progetto 3 è un'app di moduli di vincita e questo utilizza il servizio Web come riferimento e chiama tale servizio per ottenere il set di dati .

Nel processo di creazione di questa applicazione, nel PL, ho aggiunto un riferimento al DataSet generato sopra nel progetto 1 e del carico di forma chiamo il servizio web e assegnare il DataSet ricevuto dal servizio web a questo set di dati. Ma ottengo l'errore:

Cannot implicitly convert type 'PL.WebServiceLayerReference.NorthwindDataSet' to 'BL.NorthwindDataSet' e:\My Documents\Visual Studio 2008\Projects\DataSetWebServiceExample\PL\Form1.cs

Entrambi i set di dati sono gli stessi, ma perché ho aggiunto riferimenti da luoghi diversi, sto ottenendo l'errore precedente penso.

Quindi, ciò che ho fatto è stato aggiungere un riferimento al progetto 1 (che definisce il set di dati) al progetto 3 (l'interfaccia utente) e utilizzato il servizio Web per ottenere il DataSet e l'assegnazione al tipo corretto, ora quando il il progetto 3 (che ha il modulo web) viene eseguito, ottengo l'eccezione di runtime di sotto.

System.InvalidOperationException: There is an error in XML document (1, 5058). ---> System.Xml.Schema.XmlSchemaException: Multiple definition of element ' http://tempuri.org/NorthwindDataSet.xsd:Customers ' causes the content model to become ambiguous. A content model must be formed such that during validation of an element information item sequence, the particle contained directly, indirectly or implicitly therein with which to attempt to validate each item in the sequence in turn can be uniquely determined without examining the content or attributes of that item, and without any information about the items in the remainder of the sequence.

Penso che questo potrebbe essere a causa di alcuni errori di riferimento incrociato.

La mia domanda è, c'è un modo per utilizzare i DataSet generati dallo studio visivo in modo tale che io possa utilizzare lo stesso DataSet in tutti i livelli (per riutilizzarli) ma separare la logica della scheda di tabella al livello di accesso ai dati in modo che il front end è astratto da tutto ciò dal servizio web?

Se devo scrivere a mano il codice che ho sciolto la bontà dei dati gruppo elettrogeno dà e anche se ci sono colonne aggiunte più tardi ho bisogno di aggiungere a mano, ecc in modo che voglio utilizzare la procedura guidata di Visual Studio, per quanto possibile.

risposta

2

Sarei rimasto lontano dai set di dati se fossi in te. Sono molto una soluzione .NET 2.0 per il problema, e non erano neanche una soluzione molto buona.

Vorrei usare Entity Framework come livello dati - non hanno i problemi di un DataSet, incluso quello che stai vedendo. Un DataSet deve vivere in entrambi i mondi, sia XML che relazionali, e non sempre si adattano. Entity Framework può creare modelli di entità che devono essere conformi solo ai concetti di programmazione standard come l'ereditarietà e l'associazione.

Entity Framework ha anche meno problemi durante il trasferimento su servizi Web. Dovresti utilizzare WCF per tutti i tuoi nuovi servizi Web (Microsoft ora considera i servizi Web ASMX come "tecnologia legacy"), ma anche con i servizi web ASMX, le entità EF si trasferiranno in modo abbastanza pulito. Ci sono alcuni problemi relativamente minori in .NET 3.5, ma quelli sono affrontati in .NET 4.0.

0

Vorrei eseguire il backup di John qui, utilizziamo EF v1.0 in un'app di N livelli e, naturalmente, ha i suoi problemi, ma ottieni oggetti regolari che puoi inviare tramite il servizio. Tuttavia, consiglierei (nel caso in cui andiate con EF1 non EF4 che ha la capacità di esporre i suoi oggetti come POCO) per avere uno strato separato di oggetti DTO che vorrei mappare a DO oggetti da voi DAL, e usare DTO per il trasferimento attraverso il servizio . Anche considerare l'utilizzo di .NET RIA Services, sono davvero fantastici

@sb: il DTO, su EF, quick overlook of RIA services, vecchio articolo su DTO with datasets, ciò che si sta cercando di fare.

+0

Grazie. Dove posso saperne di più sugli argomenti che hai menzionato sopra? Inoltre, questo è un progetto legacy, quindi puntare a spostare il codice esistente (big code base) a un nuovo paradigma potrebbe essere d'aiuto, ma potrei non avere molta flessibilità nello spostamento ... –

+0

Ho aggiunto collegamenti al mio commento – vittore

+0

grazie per il vostro puntatori! –

0

My question is, is there a way to use the visual studio generated DataSets in such a way that I can use the same DataSet in all layers (for reuse) but separate the Table Adapter logic to the Data Access Layer so that the front end is abstracted from all this by the web service

Se non si vuole riscrivere la vostra applicazione per EF o aggiungere DTOs, e si sa gli schemi sono uguali, è possibile impostare lo schema set di dati nel livello di presentazione tramite il servizio web.

Project3DataSet.ReadXmlSchema( 
    new StringReader(Project2WebService.GetCustomersDataSetSchema())); 

[WebMethod] 
public string GetCustomersDataSetSchema() 
{ 
    return new Project1DataSet().GetXmlSchema(); 
} 

Lo schema del set di dati funge da modello di oggetto. Non carina ma dovrebbe fare il lavoro.

Con ciò detto, se questo è un nuovo progetto, sono d'accordo con le altre risposte - evitare i set di dati.

+0

Grazie. Questo sicuramente mi aiuterà poiché si tratta di una base di codice legacy che potrei non essere in grado di spostare su EF. C'è già un sacco di codice già esistente. Grazie ancora. –