2009-05-15 25 views
9

arasında kopyalamak için LINQ to SQL kullanarak, ikisi arasındaki kayıtları aktarmak için herhangi bir kolaylık var mı? Yol boyunca birkaç ek işlem yapmam gerektiğinden ve aktardığım kayıtları temsil eden nesnelerin bu kadar kolay olmasını sağlamak için SQL'e LINQ kullanıyorum. Bu küçük ölçekli bir yardımcı uygulama, SSIS muhtemelen overkill ve SQLBulkCopy kolayca yolda nesneleri sorgulamak için izin vermiyor.özdeş şemanın iki veritabanları Verilen veritabanları

Ne yapmak istiyorum şudur:

bilinen nedenlerle, bu mesaj ile bir istisna atar Ama
public static void TransferCustomer 
        (DBDataContext DCSource, 
         DBDataContext DCDest, 
         int CustomerID) 
{ 
    Customer customer; 
    using (DCSource = new DBDataContext(SourceConnStr)) 
    { 
    customer = DCSource.Customers 
         .Where(c => c.CustomerID == CustomerID) 
         .Single(); 
    } 

    using (DCDest = new DBDataContext(DestConnStr)) 
    { 
    DCDest.Customers.InsertOnSubmit(customer); 
    DCDest.SubmitChanges(); 
    } 
} 

:

bir girişimde takın veya ekleme yapılmıştır Yeni olmayan, belki başka bir DataContext'ten yüklenmiş olan varlık. Bu desteklenmiyor.

public static Customer Clone(this Customer customer) 
{ 
    return new Customer() 
    { 
    Name = customer.Name, 
    Email = customer.Email 
    etc... 
    }; 
} 

ve sonra klonlanmış madde eklenirken:

böyle nesnenin basit bir kopyasını yaparak bu yuvarlak alabilirsiniz. Yalnızca söz konusu alanları kopyalarım ve tablo ilişkilerini temsil eden herhangi bir referansı kullanmazsam, bu iyi çalışır. Ancak biraz uzun-sarmalı ve bunu yaptığım gibi, Clone yöntemindeki her alanı manuel olarak atamam gerekiyor. Bunu kolaylaştıracak herhangi bir yol önerebilir mi? Bilmek istediğiniz iki şey vardır:

  1. LINQ to SQL Can

    daha kolay bir şekilde bunu,
  2. ekler sığ bir kopyasını yapmak için yansıma kullanmanın güzel bir yolu var mı?

çok teşekkür ederiz!

cevap

0

bu tamamen akademik bir egzersiz var mı?

i ciddiye SSIS kullanma konusunda düşünürdüm Değilse: yerine http://msdn.microsoft.com/en-us/library/ms141026.aspx veya Rhino ETL bu olmazsa. Veritabanları arasında http://ayende.com/Blog/archive/2008/01/16/Rhino-ETL-2.0.aspxfor aktarımı veri [bağlantı metni] İşte [1]

+1

deneyin ama bana kullanmak için sadece hafif bir yardımcı uygulamadır. Her partide 50'den fazla satırın çeşitli tablolara aktarılmasını beklemiyorum, bu yüzden SSIS'in muhtemelen aşırı olduğunu düşünüyorum. Nesne başına bir klon yöntemini kullanarak şu anki çözümüm gerçekten güzel çalışıyor, ama kendini beğenmiş gibi hissettiriyor. Daha fazla klonlama yöntemi yazmadan önce daha iyi bir yol bulmak istediğim için daha fazla tablo eklemem gerek! –

3

sığ klon LINQ nesnelere bir yol (atlayarak birincil anahtar): Copy Linq Objects.

Size özelliklerini kullanmıyorsanız meta modeli kullanmak için tweaked. Sonra tek ihtiyacınız olan 2 veri-bağlamı (bir kaynak, bir hedef). Copy from one database table to another C#

+0

Bu gerçekten yararlı bir teşekkür. Otomatik olarak oluşturulan varlık sınıflarını kullanıyorum, böylece klonlama yönteminizi kullanmam için gereken tüm işaretlemeler var. LINQ to SQL'in bunu daha kolay yapması gerektiğini düşünüyor, ancak kimse bunu nasıl yapacağını bilmiyorsa, bu bana çok zaman kazandıracak. –

0

Neden bunu yapmak için LINQ kullanmak bkz -

Alternatif olarak, SqlBulkCopy bakmak olabilir? SQL Server'ın DTS'sini kullanabilmeniz için bir çerçevenin atılması biraz zor görünüyor.

+0

DTS'ye bile ihtiyacınız yok; SqlBulkCopy çalışır ve yaklaşık 5 satır koddur. –

+0

Bu sırada birkaç ekstra işlem yapabilmem gerekiyor - bu durumda, varlık sınıflarına sahip olmak hayatımı başka şekillerde kolaylaştırıyor ... Bunun kayıtları aktarmanın en iyi yolu olmadığını biliyorum ancak birkaç tane var LINQ kullanmak isteyen diğer faktörler. –

+0

DTS ile özel şeyler yapabileceğinizi düşünüyorum. Ne kadar esnek olduğuna emin değilim. Burada bir cevap bulamazsanız araştırmaya değer olduğunu düşünüyorum. – uriDium

0

Ben LINQ SQL varlıkları ayırmak için DataContractCloner kullanın:

/// <summary> 
/// Serializes the entity to XML. 
/// </summary> 
/// <returns>String containing serialized entity.</returns> 
public string Serialize() 
{ 
    return DataContractCloner.Serialize<Organization>(this); 
} 

/// <summary> 
/// Deserializes the entity from XML. 
/// </summary> 
/// <param name="xml">Serialized entity.</param> 
/// <returns>Deserialized entity.</returns> 
public static Organization Deserialize(string xml) 
{ 
    return DataContractCloner.Deserialize<Organization>(xml); 
} 

Tüm LINQ SQL kişiler zaten açıklamalı, bu nedenle bu daha sonra bir yeniden ekleyebilirsiniz eklenebilen bir klon yaratır birkaç uyarı. Birincisi, yabancı anahtar ilişkileri çözülecektir, bu yüzden bağımlılık sırasına girmelisiniz ve eğer döngüsel ilişkileriniz varsa, yabancı anahtarları şemanızdan çıkarmanız ve transferden sonra yeniden başvurmanız gerekecektir.İkinci olarak, LINQ-to-SQL bir kimlik eklemesi gerçekleştirmez, bu nedenle otomatik artışlı kimlik sütunları kullanıyorsanız, göndermede sorun yaşarsınız. Identification insert'i etkinleştirmek için DataContext'i zorlamakla başarı elde edemedim, ancak YMMV.

+0

Evet, ama soru bir DataContractCloner nedir? Belgelerdeki hiç bir referans bulamıyorum ... –

+0

Evet - Google tam olarak bir sonuç ortaya çıkıyor: Bu sayfa! –

0

Bunun yerine, SQLBulkCopy sınıfını kullanmayı düşünebilirsiniz. Bu konuda bir kod proje makalesi bulabilirsiniz: http://www.codeproject.com/KB/database/SqlBulkCopy.aspx. Bunu yapmak için daha hızlı bir yol olurdu, ama sanırım LINQ-to-SQL'e izin vermek yerine sorguları kendiniz oluşturmanızı gerektirecektir.

3

Bu gerçek bu

using (DCDest = new DBDataContext(DestConnStr)) 
{ 
    DCDest.Customers.InsertOnSubmit(customer.ToList()); //note the use of .ToList() 
    DCDest.SubmitChanges(); 
} 
+0

Bu benim için mükemmel çalıştı. Teşekkürler! –

İlgili konular