2013-01-03 13 views
6

Ho un database precedente che tutti i siti hanno, descrive contenuti specifici in un certo numero di catagory/subcatagory/formato di elementi figlio. Fino ad ora, l'aggiunta/modifica del contenuto è o il lavoro manuale nelle tabelle OPPURE lo strumento di Windows Form raw (l'ho creato quando ho iniziato nel lavoro!).Quale ORM posso utilizzare per Access 2007 - 2010? Sto cercando di legare WPF alle tabelle, ecc.

Desidero che Entity Framework trascini, rilascia, associa e esegua la capacità di codifica con WPF 4.5 e .net 4.5.

Ho esitato a utilizzare NHibernate poiché EF5 è molto semplice da usare, ho capito che Nhibernate è più lavoro (anche se un ORM più veloce). Ci sono alternative che funzionano bene? Sto cercando di evitare troppe impostazioni manuali, se possibile. L'editor non è un progetto obbligatorio e non posso giustificare un sacco di lavoro extra su di esso, ma renderebbe il mio lavoro più semplice per i prossimi 2 anni se fosse stata realizzata una bella versione di esso.

Tutti gli argomenti contro l'accesso lo so molto bene :) - lo scambio di questo non è un'opzione per almeno un anno.

Dopo aver cercato nel sito StackOverflow, non vedo troppe domande per chiederlo, ma mi scuso se ho perso una buona soluzione!

Grazie per qualsiasi suggerimento reso!

Aggiornamento: Penso che dovrei affinare la mia domanda un po 'come quello che volevo ottenere in quale generazione del codice, in modo da non dover compilare manualmente tutte le classi per il database Access. Da quello che posso vedere, il lavoro di Dapper riguarda l'efficienza, ma è diverso dalla generazione del codice. Provenendo da una mentalità dell'entità quadro, posso vedere dove ho unito i compiti in qualche modo nel mio pensiero :). Quindi, a parte il fatto di far bollire il mio, qualcuno conosce un buon codice per l'uso con Access. Questo posso sposarmi con Dapper :).

risposta

7

Non è possibile utilizzare Entity Framework, perché non funziona con i database di Access.

È possibile utilizzare NHibernate con MS Access, sebbene NH non supporti Access out of the box.
È necessario NHibernate.JetDriver da NHContrib e here sono impostazioni di esempio per il file di configurazione NH.

Se ricordo correttamente, NH Contrib deve essere compilato con la versione esatta di NH che stai utilizzando, quindi probabilmente devi scaricare il codice sorgente e compilarlo da solo.

In alternativa, è possibile utilizzare uno dei molti micro-ORM, ad esempio lo Stack Overflow Dapper.

Dapper è agnostico DB, quindi può connettersi a tutto, compreso l'accesso. Citazione dal sito ufficiale:

Will dapper funziona con il mio provider db?
Dapper ha DB dettagli specifici di implementazione, funziona in tutti i ADO provider .NET tra cui SQLite, sqlce, Firebird, Oracle, MySQL e SQL Server

Lo svantaggio è che, poiché Dapper è DB agnostico, si devi implementare alcune cose avanzate, come paging.


EDIT:

IMO Dapper è nel "abbastanza facile da eseguire rapidamente catagory".
Date un'occhiata a questo:
(complete demo project here)

using System; 
using System.Data.OleDb; 
using Dapper; 

namespace DapperExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb")) 
      { 
       var list = con.Query<Product>("select * from products"); 

       Console.WriteLine("map to a strongly typed list:"); 
       foreach (var item in list) 
       { 
        Console.WriteLine(item.ProductNumber + " : " + item.Description); 
       } 

       Console.WriteLine(); 

       var list2 = con.Query("select * from products"); 

       Console.WriteLine("map to a list of dynamic objects:"); 
       foreach (var item in list2) 
       { 
        Console.WriteLine(item.ProductNumber + " : " + item.Description); 
       } 

       Console.ReadLine(); 
      } 
     } 
    } 

    public class Product 
    { 
     public string ProductNumber { get; set; } 
     public string Description { get; set; } 
    } 
} 

Ci sono due query diverse in questo codice di esempio.

Il primo si associa a un elenco fortemente tipizzato, ad es. il risultato è un IEnumerable<Product>. Ovviamente serve una classe Product alla quale può eseguire il mapping.

La seconda query restituisce un IEnumerable<Dynamic> (> = .NET 4.0) che significa che le proprietà vengono valutate al volo e non è necessario definire una classe prima, ma lo IntelliSense).
La mia opinione personale è che la sicurezza del tipo mancante è un rompicapo per me (preferisco la prima sintassi per le query), ma forse è qualcosa che fa per voi.

+1

Quindi non c'è nulla nel abbastanza facile da eseguire rapidamente catagory sto cercando di indovinare, allora? È un peccato. Il lavoro non è abbastanza grande/importante da scavare davvero in NHibernate, purtroppo, altrimenti gli dedicherei alcuni giorni. Forse Dapper potrebbe integrarsi con il mio generatore di ciotole. Grazie per il tuo aiuto e i link. È un peccato che MS Access sia stato escluso dalla maggior parte dei provider dalla maggior parte degli ORM: potrebbe non essere un DB corretto ma è diventato famoso! –

+0

Grazie per aver aggiunto questo, molto apprezzato! –

+0

Anche se non ho dato abbastanza ore, non vedo alcun vantaggio nell'usare Dapper per quello che sto facendo - sembra che creo ancora tutte le mie lezioni a mano per sposarmi al database? Ho appena perso il punto (Accettato se è così) come mi sono abituato all'aspetto di generazione del codice di Entity Framework. Sto cercando di risolvere questo problema ora, ma sembra così. –

5

L'odio per resuscitare un thread precedente ma di recente ho realizzato un progetto WPF utilizzando PetaPoco, un micro-ORM, con MS Access, quindi ho pensato di condividere la mia implementazione.

per aggiungere il supporto MS Access a PetaPoco, è sufficiente aggiungere un paio di pezzi di codice:

prima aggiungere una classe AccessDatabaseType. Tutte le classi DataBaseType si trovano alla fine del file PetaPoco.cs. Basta aggiungere la nuova classe dopo SqlServerDatabaseType.

class AccessDatabaseType : DatabaseType 
{ 
    public override object ExecuteInsert(Database db, IDbCommand cmd, string PrimaryKeyName) 
    {    
     db.ExecuteNonQueryHelper(cmd); 
     return db.ExecuteScalar<object>("SELECT @@@IDENTITY AS NewID;"); 
    } 

} 

Avanti, modificare PetaPoco.Internal.DatabaseType.Resolve() per sostenere l'AccessDatabaseType. (Questo codice presuppone che si sta utilizzando il provider OLE DB Jet)

public static DatabaseType Resolve(string TypeName, string ProviderName) 
{ 
    //... 

    if (ProviderName.IndexOf("Oledb", StringComparison.InvariantCultureIgnoreCase) >= 0) 
     return Singleton<AccessDatabaseType>.Instance; 

    // Assume SQL Server 
    return Singleton<SqlServerDatabaseType>.Instance; 
} 

Infine, creare un'istanza PetaPoco utilizzare questo:

Db = New PetaPoco.Database("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb", "System.Data.Oledb") 

Limitazioni:

  • PetaPoco assume le chiavi primarie sono campi numerazione automatica/identità. Se si dispone di un PK che non è un numero autonumerico o di un PK composito, è necessario implementare la logica di salvataggio del proprio inserto &.
  • Non avevo bisogno di cercapersone nella mia applicazione, quindi non l'ho implementato.
+1

Ho notato che il repository PetaPoco ufficiale è stato aggiornato con il supporto di MS Access. (https://github.com/CollaboratingPlatypus/PetaPoco/) Hrrmm, mi piacerebbe pensare che il mio post qui abbia ispirato la nuova funzionalità. :) – voon

0

Stiamo usando Jet Entity Framework Provider. In questo modo possiamo facilmente portarlo su un altro database più tardi.

Non ha tutte le limitazioni sopra menzionate e funziona benissimo.

Problemi correlati