SORU
26 ŞUBAT 2009, PERŞEMBE


Nasıl Seri 2 SQL 2 Varlıklar Etmeniz geçmek için?

Linq2entities ve ADO.NET Varlık Çerçevesi (burada L2E denilen) linq2sql taşımak isteyen insanlar için bir referans başlamak istiyorum.Hangisinin daha iyi olduğunu tartışmak istemiyorum. Ben sadece birinden diğerine geçiş yapmak isteyen kişi için bu ikisi arasındaki farkların listesini oluşturmak istiyor.

Kolay temel şeyler: linq2sql veri sınıfları kaldırmak, ADO.NET model (veritabanı oluşturulmuş) ekleyin. 'Varlıklar' eski datacontext. adını yeniden adlandırın

(Kaydet) L2S değişiklikler devam etmektedirKullanmak istiyorum:

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

L2E bu şekilde değiştirilmesi gerekir:

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

L2S yeni bir kayıt eklemek içinkullanmak istiyorum:

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

L2E bu şekilde değiştirilmesi gerekir:

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

Bir değiştirdi eklemek için L2S içinde datacontext/modeli nesne(zaman damgası kullanarak):

mydc.MyTable.Attach(myRow);

L2E:

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

L2S (orijinal nesne kullanarak) datacontext/model için değişen bir nesne eklemek:

mydc.MyTable.Attach(myRow, myOriginalRow);

(MSDN - Apply Changes Made to a Detached Object) L2E:

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

sil L2S bir rekor:

mydc.MyTable.DeleteOnSubmit(myRow);

L2E:

mydc.DeleteObject(myRow);

oluşturulan SQL L2S hata ayıklama komutları göster:

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

L2E you can show the SQL for a query (TFD sayesinde):

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

Ne yazık ki, SQL SaveChanges çağrısı için oluşturulan çıkış yolu buldum() - bunun için a SQL profiler kullanmak gerekir.

Eğer hiçbiri L2S varsa düzeninden bir veritabanı oluşturmak:

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

L2E:

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

L2S veritabanı karşı bir SQL komutu çalıştır:

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

L2E:

EF (dikkat, eSQL DDL veya DML (Insert, update, delete, alter) komutları henüz desteklemiyor): veritabanında eSQL bir komut çalıştırmak için

using System.Data.EntityClient;
...
EntityConnection conn = this.Connection as EntityConnection;
using (EntityCommand cmd = conn.CreateCommand())
{
  conn.Open();
  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();
}

Komut metin 100% T-SQL ile aynı değil hangi Varlık SQL.
(TFD sayesinde)

Eğer aynı bağlantı/VİD komutları DDL ihtiyacınız varsa, veritabanı bağlantısı kendiniz oluşturun, EF selfmade db bağlantısı kullanarak Bağlan ve VİD komutları için bu bağlantıyı kullanmanız gerekebilir. Hiç hoş değil, kendiniz için bir göz atın:

MetadataWorkspace workspace = new MetadataWorkspace(new string[] { "res://*/" }, new Assembly[] { Assembly.GetExecutingAssembly() });
using (SqlConnection sqlConnection = new SqlConnection("Data Source=salsa;Initial Catalog=SamAlyza;Integrated Security=True"))
using (EntityConnection econ = new EntityConnection(workspace, sqlConnection))
using (AlyzaDataClassesDataContext adc = new AlyzaDataClassesDataContext(econ))
{
   // now you can use the SqlConnection like always
}

default values for a newly created L2S-Class geçersiz sağlamak için kısmi yöntemi OnCreated:

partial void OnCreated()
{
  Name = "";
}

L2E sadece masa sınıfı için varsayılan kurucuyu oluşturabilirsiniz:

partial class MyTable
{
  public MyTable()
  {
    Name = "";
  }
}

CREATE TABLE dbo.[MyTable]
(
 [MyTableID] uniqueidentifier NOT NULL ROWGUIDCOL CONSTRAINT [PK_MyTable] PRIMARY KEY,
 [Name] nvarchar(100) NOT NULL,
)  ON [PRIMARY]

ALTER TABLE dbo.[MyTable] ADD CONSTRAINT [DF_MyTable_ID] DEFAULT (newid()) FOR [MyTableID]


CREATE TABLE dbo.[MySubTable]
(
 [MySubTableID] uniqueidentifier NOT NULL ROWGUIDCOL CONSTRAINT [PK_MySubTable] PRIMARY KEY,
 [MyTableID] uniqueidentifier NULL,
 [Subname] decimal(18,2) NOT NULL,
)  ON [PRIMARY]

ALTER TABLE dbo.[MySubTable] ADD CONSTRAINT [DF_MySubTable_ID] DEFAULT (newid()) FOR [MySubTableID]

ALTER TABLE dbo.[MySubTable] ADD CONSTRAINT [FK_MySubTable_MyTable] FOREIGN KEY
(
 [MyTableID]
) REFERENCES dbo.[MyTable]
(
 [MyTableID]
) ON DELETE CASCADE

L2S ilgili MySubTable Tablom bir Kayıt:

  MyTable myRow = new MyTable();
  myRow.MySubTable.Add(new MySubTable());
  mydc.MyTable.InsertOnSubmit(myRow);

L2E çok benzer:

  MyTable myRow = new MyTable();
  myRow.MySubTable.Add(new MySubTable());
  mydc.AddToSaLyWebsites(test);

bir tablo içinde arama yapmak içiniç , geçer:

from u in adc.MySubTable 
where u.MyTableID == _searchForTableID && u.Name == _searchForName 
select u

L2E ilişkin sütunlar erişebilirsiniz:

from u in adc.MySubTable 
where u.MyTable.MyTableID == _searchForTableID && u.Name == _searchForName 
select u

(tabii ki de kullanabilirsiniz)

from u in _searchForTable.MySubTable
where u.Name == _searchForName
select u

(garip yan not: _searchForTable bu iş için EF bağlı olması gerekmez.)

Miscellanous notlar:

L2S içinde SERİ olarak miscellanous fonksiyonları kullanabilirim. Eğer ben L2E özel fonksiyonları kullanabilir miyim NotSupportedException. Bu yüzden, yerine

from t in mydc.MyTable 
where t.Date >= _searchForDate && t.Date <= _searchForDate.AddHours(2) 
select t;

L2E bir kullanmak gerekir

DateTime endDate = _searchForDate.AddHours(2);
from t in mydc.MyTable 
where t.Date >= _searchForDate && t.Date <= endDate 
select t;

(Onlara ben gelirken bu yazı daha farklılıklar, ya da birine cevap olarak ekler gibi) alacağım

Bazı bağlantılar, yararlı belki:
- Difference between Transact-SQL and Entity-SQL
- NET - ADO.NET Entity Framework & LINQ to Entities
- Mike Taulty about Disconnected LINQ to Entities (for beta 2 of L2E)

CEVAP
26 ŞUBAT 2009, PERŞEMBE


Oluşturulan SQL komutları göstermek için hata ayıklama için EF

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

AFAIK DB oluşturmak veya DDL iş her türlü yapmak için komut vardır. Bu "SQL" dil . Varlık tasarımı sınırlama

EDMX tasarım yüzeyi geçerli veritabanı şeması, tersi değil göster

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • Machinima

    Machinima

    17 Ocak 2006
  • TechXCentral

    TechXCentral

    12 Temmuz 2011