2010-01-18 12 views
6

kullanarak bir kaydı silme hatası Bir müşteriden kısa bir süre önce bir hata raporu aldım ve çözümü çözemiyorum. Umarım birisi bana neyin yanlış olabileceğine dair bir fikir verebilir.Linq2SQL

Csla.DataPortalException:

hata yeterince basit görünmektedir DataPortal.Delete System.InvalidOperationException (başarısız oldu: Sekans System.Linq.Enumerable.SingleOrDefault [TSource] (IEnumerable`1 kaynağında birden fazla eleman içerir) İşte

bir parametre olarak FileId (PK) alır benim DataPortal_Delete yöntemidir. Ben kontrol

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria) 
    { 
     using (var ctx = ContextManager<Ronin.Data.RoninDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = ctx.DataContext.Files 
        .Single(row => row.FileId == criteria.Value); 

      ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources); 

      ctx.DataContext.Files.DeleteOnSubmit(data); 

      ctx.DataContext.SubmitChanges(); 
     } 
    } 

ilk şey aynı FileID başka kayıt altına alınmasını görmekti (prima olmalarına rağmen anahtar, bu imkansız olmalıdır). Tüm FileIds aslında benzersiz idi. Müşteri veritabanına bağlanan uygulamayı başlattım ve kaydı silmeye çalıştım ve herhangi bir sorun olmadan çalıştı. İstemci sitesindeki BT adamı, kullanıcı tarafından gerçekleştirilen eylemlerin adım adım ekran görüntülerini göndermek için "Sorun Adım Kaydedicisi" ni kullandı. Sıra dışı bir şey değil ve farklı bir makine kullandığında, kaydı hiçbir hata olmadan silebildi. Görünüşe göre bu, uygulama sadece Windows 7'de çalıştırıldığında gerçekleşir.

Bu, buna neyin neden olabileceği ile ilgili herhangi bir fikir mi dedi?

+0

Dosyalar.FileId bu tablonun birincil anahtarıdır? –

+0

Hata bu kod snippet'inde oluşturulduğundan emin misiniz? Hata SingleOrDefault başvuruyor, ancak işlev Tek kullanıyor. – gfrizzle

+0

FileSources Null mı? Bunlar farklı nesneler ise, bunları silmeden önce bunları almak için bir içermek zorunda değilsiniz? – awright18

cevap

1

yerine, sorunun kaynağı Tek çağrısı olduğunu varsayarsak:

ctx.DataContext.Files.Single(...) 

değişikliği kod bu sorgudan birden çok satır geri dönüşüne izin ve o zaman daha döndüğünde onu geri dönen ne giriş yapmak için bir sıra. Bu sizi "yinelenen" veri sorununuza yönlendirmelidir.

Bakılması gereken diğer bir şey, sahnelerin arkasında oluşturulan SQL'dir. Bunun yardımcı olacağından emin değil, ama canını yakamaz. Veri modelinizi bilmiyorum, bu yüzden kodunuzu da anlayabiliyorum.

+0

Burada istisna mesaj oldukça açık; Single, sadece bir satırın iade edileceği gerçeğini zorlar. İki veya daha fazla istisna yol açacaktır. Kodu değiştirmezdim; basit bir sql ifadesi dupe'yi bulacaktır: 'fileid'i seçin, saymak (*) Dosya grubundan count (*)> 1 'olan dosyaid – Andy

0

Yalnızca Windows 7'de gerçekleşirse, işletim sistemi bu durumdan kaynaklanabilir. Vista'da denedin mi? Vista'nın ortamı Windows 7'de simmilar. Windows Virtual PC + XP Mode'u da kullanabilirsiniz. Bu, kullanıcıların Windows XP'de kullandıkları gibi uygulamaları çalıştırmasına izin vermek için Windows 7 için özel olarak tasarlanmış bir sanallaştırma uygulamasıdır. Not: XP Modu sanallaştırma özellikli bir işlemci gerektirir.

0

one öğesinin silinmesi sırasında aynı özel durum vardı. Sorun, dbml -Dosya'da tanımlanan bir yabancı anahtar ilişkisi olduğu ortaya çıktı. Bu benim durumumdaki istisnanın sebebi buydu. Silmeyi kaldırdıktan sonra kayıt silindim (ve diğer tablodan kayıtları silmek için kaskadlamak istemedim, sadece sadece yabancı anahtar sütununu ayarlamak için linq-to-sql nasıl yapılandırılacağını öğrenmek gerekir null)