2010-03-19 27 views
15

kullanarak kaskad silme ile ilgili sorun Ben bir Kişiyi sildiğinizde, silme basamaklandırılmış bir SQLite DB var. Bir kişiyi el ile sildiğimde bu iyi çalışır (PersonID'ye başvuran tüm kayıtlar silinir). Ben Varlık Çerçeve Kişi silmek için kullandığınızda Ama bir hata alıyorum: Bu oluşmasını nedenEntity Framework ve System.Data.SQLite

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

anlamıyorum. Tetikleyicim, silinmesi söylenen nesneyi silmeden önce tüm ilgili nesneleri temizlemeye ayarlıdır.

Model düzenleyiciye gittiğimde ve ilişkinin özelliklerini kontrol ettiğimde, OnDelete özelliği için hiçbir eylem göstermiyor. Neden bu, DB'den çekerek doğru şekilde ayarlanmıyor? Bu değeri Cascade olarak değiştirirsem her şey düzgün çalışır, ancak bu el kitabında değişiklik yapmaya dayanmamayı tercih ederim çünkü eğer modelimi DB'den yenersem ve onu kaybederse.

Tablolarım için ilgili SQL var.

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE 
) 
CREATE TABLE [Person] 
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 
) 

cevap

24

Sadece bu kesin sorunla uğraştım. EF'yi Update model from database... seçeneğine kullandığımda, silme için "Cascade" kuralını düzgün bir şekilde almadığı ortaya çıktı.

EF veritabanı modelinize gidin, soruna neden olan ilişkilendirmeyi tıklatın, ardından End1 OnDelete (Veritabanı şemasına bağlı End2 olabilir) öğesinin Cascade olarak ayarlandığından emin olun.

+0

End1 veya End2'yi güncellemeniz gerekecek mi? Yoksa sadece deneme yanılma mı? –

+1

Veritabanınızın modellemesine göre değişir.Eğer bir bire çok ilişki varsa, 'one' sonu ben de aynı konuyu – Omar

1

Bana bir sağlayıcı hatası gibi geliyor. Basamak DB'den alınmalıdır. SQL Server ile deneyin; orada çalışır göreceksiniz. Bunu, SQLite sağlayıcınızı yazan kişiye rapor etmelisiniz.

+0

Sadece bir SQLite sağlayıcısı hatası olmadığını doğrulayabilirim. Modelin tamamını kaldırıp yeniden oluşturmadıkça, kaskadların eklenmesi SQL Server'daki modele yansıtılmaz. Ağrı. – Andiih

+0

@Andiih, yalnızca ilk önce bu varlıksız (muhtemelen hatalı olarak) eklenmişse. Tasarımcı, özel CSDL'nizin üzerine yazmaz. Bu aslında bir özellik. –

+0

Evet, veri tabanı tasarımında sorun yaşadım. CSDL'yi uyarlamamıştım. Tüm modeli silmeden ve yeniden eklemeden bir yenilemeyi zorlamanın bir yolu var mı? – Andiih

4

SQL Server ile aynı sorunu yaşıyordum. Modu veritabanından güncellemeye çalıştığımda, kaskat kurallarını almadı. Modelin oluşturulduktan sonra kuralların eklendiğini unutmayın. Hatta bir tabloyu modelden silmeyi ve tekrar eklemeyi denedim. Bu aynı etkiye sahipti - basamaklı kurallar yok.

Bununla birlikte, aynı tam tablolarla yepyeni bir model oluşturduğumda, kaskat kurallarını aldı. Bu yüzden benim çözümüm eski modeli silmekti ve aynı isimle yeni bir tane oluşturdu.

Veritabanı işleminden güncelleme modelinde bir sorun var sanırım.

+1

' ayarlanmalıdır. Çünkü genellikle kişiselleştirmelerinizi tutmak istersiniz. Bu durumda, değil mi, ama bu ortak durum değildir. –

+1

ile aynı sorunu vardı Cascade' – Andiih

+0

mevcut CSDL üzerine asla tasarımcı teyit edebilir SQL Sunucusu –

0

Navigasyon özelliğini yalnızca yabancı anahtar özelliğini kullanmadan kullanabilirsiniz. Silme çağrısı, koddaki sorunu çözmez, çünkü kişi nesnesinin silinmiş olarak işaretlenmeyeceğini belirtir.