42 votes

Comment passer de Linq 2 SQL à Linq 2 Entities?

J'aimerais commencer une référence pour les personnes qui veulent passer du linq2sql à linq2entities et la ADO.net Cadre de l'Entité (ici appelé L2E). Je ne veux pas discuter de ces deux, c'est mieux. Je veux juste créer une liste de différences entre ces deux pour les personnes qui veulent passer de l'un à l'autre.

Les trucs de base est simple: supprimer le linq2sql classes de données, ajouter ado.net modèle (créé à partir de la base de données). Renommer 'Entités' au nom de l'ancien datacontext.


Maintenant, les différences. Par exemple, pour persister (enregistrer) des changements dans L2S j'utilise:

using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
  // change data
  mydc.SubmitChanges();
}

En L2E ce devrait être modifié afin de:

using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
  // change data
  mydc.SaveChanges();
}


2ème exemple, pour insérer un nouvel enregistrement dans L2S vous pouvez utiliser:

using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
  MyTable myRow = new MyTable();
  mydc.MyTable.InsertOnSubmit(myRow);
  mydc.SubmitChanges();
}

En L2E ce devrait être modifié afin de:

using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
  MyTable myRow = new MyTable(); // or = MyTable.CreateMyTable(...);
  mydc.AddToMyTable(myRow);
  mydc.SaveChanges();
}


Pour les autres extraits de code que je vais sauter le à l'aide de (...) une partie et la SubmitChanges/SaveChanges, puisque c'est le même à chaque fois.
Pour attacher un objet changé pour un datacontext/modèle dans L2 (à l'aide d'horodatage):

mydc.MyTable.Attach(myRow);

En L2E:

// you can use either
mydc.Attach(myRow);
// or (have not tested this)
mydc.AttachTo("MyTable", myRow);


Pour attacher un objet changé pour un datacontext/modèle dans L2 (à l'aide de l'objet d'origine):

mydc.MyTable.Attach(myRow, myOriginalRow);

En L2E (MSDN pour Appliquer les Modifications Apportées à un décollement de l'Objet):

mydc.Attach(myOriginalRow);
mydc.ApplyPropertyChanges(myOriginalRow.EntityKey.EntitySetName, myRow);


Pour supprimer un enregistrement dans L2S:

mydc.MyTable.DeleteOnSubmit(myRow);

En L2E:

mydc.DeleteObject(myRow);


Pour montrer la création des commandes SQL pour le débogage en L2:

mydc.Log = Console.Out;
// before mydc.SubmitChanges();

En L2E vous pouvez afficher le code SQL d'une requête (grâce à TFD):

using System.Data.Objects;
...
var sqlQuery = query as ObjectQuery;
var sqlTrace = sqlQuery.ToTraceString();

Malheureusement, je n'ai trouvé aucun moyen de sortie du SQL généré pour un appel à SaveChanges() - vous aurez besoin d'utiliser un générateur de profils SQL pour cela.


Pour Créer une base de données dans le schéma si aucun n'existe, L2S:

if (!mydc.DatabaseExists())
  mydc.CreateDatabase();

En L2E:

// according to TFD there are no DDL commands in L2E


Pour exécuter une commande SQL sur la base de données en L2:

mydc.ExecuteCommand("ALTER TABLE dbo.MyTable ADD CONSTRAINT DF_MyTable_ID DEFAULT (newid()) FOR MyTableID");

En L2E:

Pour exécuter une eSQL de commande sur la base de données en EF (attention, eSQL ne prend pas en charge DDL ou DML (alter, Insert, update, delete) les commandes encore):

using System.Data.EntityClient;
...
EntityConnection conn = this.Connection as EntityConnection;
usi

6voto

TFD Points 10618

Pour afficher les commandes SQL créées pour le débogage dans EF

 using System.Data.Objects;
...
var sqlQuery = query as ObjectQuery<T>;
var sqlTrace = sqlQuery.ToTraceString();
 

Autant que je sache, il n’existe aucune commande permettant de créer des bases de données ou d’effectuer une sorte de travail DDL. C'est la limitation de la conception du langage "Entity SQL"

L'aire de conception EDMX mappera votre schéma de base de données actuel, et non l'inverse.

3voto

TFD Points 10618

Pour exécuter une commande SQL sur la base de données dans EF

 using System.Data.EntityClient;
...
EntityConnection conn = new EntityConnection(myContext.Connection.ConnectionString);
conn.Open();
EntityCommand cmd = conn.CreateCommand();
cmd.CommandText = @"Select t.MyValue From MyEntities.MyTable As t";
var result = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);
result.Read();
var myValue = result.GetValue(0);
...
conn.Close();
 

Le texte de la commande est dans Entity SQL, ce qui n’est pas identique à 100% à celui de T-SQL.

1voto

TFD Points 10618

Pour obtenir la nouvelle valeur d'identité à partir d'une insertion dans EF

 Create Table dbo.MyItem (
    Id int indentity(1, 1) Primary Key,
    Value varchar(100)
)

var newItem = new MyItem() { Value = "Hello" };
context.AddToMyItem(newItem);
context.SaveChanges(true);
var theNewIdentityValue = newItem.Id;
 

Les membres d'EF viennent de rendre la tâche facile et agréable :-)

1voto

Jacob Adams Points 3108

Dans L2S, vous pouvez simplement utiliser des procédures stockées telles que des appels de fonction. En EF, le SP doit renvoyer une entité. Cela peut poser problème si votre SP ne renvoie qu'un sous-ensemble d'une entité complète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X