2011-11-21 9 views
5

Basit bir WCF istemci/sunucu durumu için çalışmak için basit bir işlem kümesi elde etmek için birkaç farklı yol deniyorum. WCF sunucum veritabanı erişimim için Entity Framework sınıfının bir sınıf düzeyi beyanı ve verileri değiştirmek için bir yöntem ve SaveChanges'e bir yöntem sunar. Oracle Data Access'i (ODP.NET) kullanıyorum. Örneğin, istemciden bir değişiklik aramak ve daha sonra WCF hizmetindeki değişiklikleri kaydetmek için ayrı bir çağrı yapmak istiyorum. Çalışmıyor. Temel olarak, her şey iyi çalışır, ancak değişiklikleri kaydetmek için ikinci çağrı yapıldığında, WCF servisi artık orijinal içeriğe sahip değildir ve bu nedenle hiçbir değişiklik kaydedilmez (ve sonuç olarak, değişiklikleri yapan önceki çağrı otomatik olarak geri alınır). .Entity Framework ve WCF'yi işlemlerle çalışmak için nasıl alabilirim? Tamam ... sır nedir?

İstemcimde her iki işlemin çevresinde İşlem kapsamını kullanıyorum ve tamamlandıktan sonra Complete() işlemini yürüttüm. WCF hizmetlerim, [TransactionFlow(TransactionFlowOption.Mandatory)]'u kullanan OperationContract'a sahiptir ve bu yöntem uygulamaları, [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]'u kullanır. Son olarak, web yapılandırmam doğru olarak ayarlanmış transactionFlow özelliği olan bir wsHttpBinding ile yapılandırıldı.

Şansım yok. Ne denediğime bakmadan, takip kaydına hizmet vermeye çalıştığımda, EF içeriği zaten yenileniyor.

+0

Tüm ciltleme işlemleri desteklenmez. http://www.wrox.com/WileyCDA/Section/Transactions-in-WCF-and-NET.id-305253.html – faester

+0

Çağrılar arasında nasıl oturum yürütüyorsunuz? WCF varsayılan olarak durumsuzdur, bu yüzden WCF'yi eyaletle bir şey yapmaya yönlendirmediğiniz sürece bir şey kaybetmiş olabilirsiniz. –

+0

edmx veya poco tarafından üretilen varlıklar – Praneeth

cevap

4

'un işe yarayıp yaramadığını görmek için bu işlemin bir önemi yoktur. İşlem işlem kaynağında çalışır, ancak ilk istekte SaveChanges'u aramadan etkin bir işlem kaynağı yoktu, çünkü EF içeriği işlemin bir parçası değildir - veritabanıdır ve veritabanı yalnızca SaveChanges'u aradığınızda etkilenir. Bu işi yapmak için dağıtılmış işlemlere ihtiyacınız yoktur. Oturuma tam hizmete ihtiyacınız var ve EF içeriğini servis örneğinde saklamanız gerekiyor. Bir istemci, tüm isteklerin hizmetiyle iletişim kurmak için aynı istemci proxy örneğini kullanır; iletişim, aynı hizmet örneği = önceki çağrıların değişikliklerini hatırlayacak aynı EF bağlamı örneği tarafından ele alınacaktır.

IMHO bu çok kötü bir mimaridir. Basitçe kullanmayın. WCF servisinde değişiklik yapacak ve bunları kaydedecek özel yöntemler ortaya çıkarın. Bu yöntemleri diğer işlem kaynakları ile işlemek için yürütmeniz gerekiyorsa, gerçek dağıtılmış işlemi kullanın.

+0

Cevabınıza saygı duyuyorum. Ve korktum ki bu cevap olurdu. Aylak. Ne yazık ki, hizmetimin kullanımını indiriyor. Örneğin, hizmetimin kullanıcılarına emir oluşturmalarına izin vermek ve/veya bu siparişlere (ürün ayrıntıları gibi) fazladan elemanlar oluşturmaya/değiştirmeye ve her iki eylemi de gerçekleştirerek tek bir işlemde kendilerini birbirine bağlamalarına izin vermek istiyorsam atomik (çoklu geçiş) bir şekilde yapılmamalıdır. Bu berbat ama ne dediğini anlıyorum. Cevabınız için teşekkürler. – Prethen

1

bunun bir nedeni olabilir. Farklı bağlamda bir güncelleme yaptığınız için. bağlam, nesnenin değiştirildiği bağlamı söylemek için nesnenin güncellendiğini ve daha sonra savechnages() öğesini çağırdığınızı bilmez.

+0

Siz haklısınız. Temel olarak, önceki cevaplayıcının kaydettiği budur. Bu bağlamı ve hizmeti durumsal hale getirmeden yapamadığım için utanç verici. – Prethen