2015-06-09 23 views
13
İşte

benim durumdur:Varlık Çerçevesi: Neden WillCascadeOnDelete() Yöntemi yok sayılır?

public abstract class Article 
{ 
    [key] 
    public Guid Guid { get; set;} 

    public string Name { get; set;} 
    . 
    . 
    . 
} 

public class Download : Article 
{ 
    ... 
} 

public abstract class Category : Article 
{ 
    ... 
} 

public class DownloadCategory : Category 
{ 
    .... 
} 

Sonra olmalı bir sayıda çoğa böyle indirin ve DownloadCategory arasındaki ilişki:

public class DownloadInCategory 
{ 
    [Key, Column(Order = 1), Required] 
    [ForeignKey("Download")] 
    Public Guid DownloadGuid { get; set; } 

    Public Download Download { get; set; } 

    [Key, Column(Order = 2), Required] 
    [ForeignKey("Category")] 
    Public Guid CategoryGuid { get; set; } 

    Public DownloadCategory Category { get; set; } 
} 

ben Add-Migration çağırdığınızda DownloadInCategory varlık için yaratılan göç şudur: Notik gibi : Burada

CreateTable("dbo.DownloadInCategories", 
c => new 
{ 
    CategoryGuid = c.Guid(nullable: false), 
    DownloadGuid = c.Guid(nullable: false), 
}) 
.PrimaryKey(t => new { t.CategoryGuid, t.DownloadGuid }) 
.ForeignKey("dbo.DownloadCategories", t => t.CategoryGuid) 
.ForeignKey("dbo.Downloads", t => t.DownloadGuid, cascadeDelete: true) 
.Index(t => t.CategoryGuid) 
.Index(t => t.DownloadGuid); 

Sorum ise e, yabancı anahtarlardan birine cascadeDelete: true eklemiyor. NİYE YA!!!!!!?????

modelbuilder Kurallarından hiçbirini değiştirmediğimi belirtmeliyim. Bu nedenle, bu şema geçişte silmek için Casscade'i eklemelidir. Benim mülklerim [Required].

Neyi yanlış yapıyorum?

teşekkürler çocuklar ...

Güncelleme: Article ve Category sınıflar abstract olduklarını lütfen unutmayın. Bu şema ile hiçbir mantıksal bir sorun yok : Ben

Güncelleme 2 yukarıdaki sınıflar değişti. Taşıma işlemini el ile düzenlerseniz, veritabanını normal olarak günceller.

Güncelleme 3: Bazı soruşturma ve testlerden sonra Sorun Category den inheritanced gibi görünüyor: My EF Kalıtım Metodolojisi TPC

Güncelleme 4'tür. DownloadCategory, Category'dan devralındığında, Cascade kullanılmaz. ama ben doğrudan makaleden DownloadCategory Inherit, Cascade dağıtılmış. Ama neden yine? Anahtar Madde sınıfına üzerindedir

DownloadCategory : Category : Article 

Download : Article 

vs: çünkü bu düşünürdüm

+0

düzenleme göç elle ince çalışırsa, kaskad anlaşılmaktadır değildir silmek neden teorik soru bu daha mı? – jjj

+5

@jjj Hayır. Bu bakış açımdan tamamen pratiktir. Göçün manuel olarak düzenlenmesi iyi bir uygulama değildir. Çalıştığım gibi daha büyük projelerde, böyle bir şey, projeye yeni özelliklerin bakımı ve geliştirilmesine daha fazla önem veriyor. Taşıma işlemini manuel olarak değiştirdiğimi düşünüyorum. ve göç, modellerin şemasıyla eşleşmelidir. – abzarak

+4

Sanırım bu, yerleşik sözleşmelerin mükemmel olduğu ideal bir dünyada doğru olurdu. Bu durumda bunun neden olduğunu anlayabilmek için kaynak kodun içine girebilirsiniz, ancak sanırım döngüleri önlemek için bir kısayolun sonucudur. – jjj

cevap

3

olduğunu. Birden çok DownloadCategories aynı Category kullanabilir, bu nedenle diğer DownloadCategory 's bozuk bırakabilir gibi silme üzerinde kaskad değil.

Bu TPC kullanarak alındığından bu çıkarım yapılmamalıdır, muhtemelen Varlık Framework bir eksikliktir. Geçici çözümler için this article'a bir göz atın.

Özellikle

bu bölümler: Varlık Framework bağımlı ve hangi tip çıkarabiliriz

Çoğu durumda bir ilişkide müdürüdür. Ancak, ilişkinin her iki ucu olduğunda veya her iki taraf isteğe bağlı olduğunda, Varlık Çerçevesi bağımlı ve sorumluyu tanımlayamaz. ilişkinin her iki sonu gerektiğinde, HasRequired yönteminden sonra WithRequiredPrincipal veya WithRequiredDependent kullanın. İlişkinin her ikisi de bittiğinde, HasOptional yönteminden sonra WithOptionalPrincipal veya WithOptionalDependent kullanın.

// Configure the primary key for the OfficeAssignment 
modelBuilder.Entity<OfficeAssignment>() 
    .HasKey(t => t.InstructorID); 

modelBuilder.Entity<Instructor>() 
    .HasRequired(t => t.OfficeAssignment) 
    .WithRequiredPrincipal(t => t.Instructor); 

Sen çağlayan WillCascadeOnDelete yöntemini kullanarak bir ilişkiye silmek yapılandırabilirsiniz. Bağımlı varlık üzerinde bir yabancı anahtar null değilse, Kod İlk ilişkisinde kaskad silme ayarlar. Bağımlı öğe üzerinde yabancı bir anahtarın geçersiz olması durumunda, Kod İlkesi ilişkide basamaklı silme ayarlamaz ve ana anahtar silindiğinde, yabancı anahtar null olarak ayarlanır.

Bu kaskad kullanarak kurallarını silme kaldırabilirsiniz:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>() 
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>() 

Aşağıdaki kod gerekli olan ilişkisini yapılandırır ve daha sonra kaskad silmek devre dışı bırakır.

modelBuilder.Entity<Course>() 
    .HasRequired(t => t.Department) 
    .WithMany(t => t.Courses) 
    .HasForeignKey(d => d.DepartmentID) 
    .WillCascadeOnDelete(false); 
+0

teşekkürler. Makale ve Kategori sınıfı Özet. Sorularımın Özet olduklarını söyleyerek güncelliyorum. – abzarak

+0

Bunun nasıl bir fark yarattığından emin değilim? –

+0

Kategori sınıfı soyut ise, Doğrudan Kategori için örnek olmaz. Ve Örnekler DownloadCategory'den. Yani "Birden Fazla Karşıdan Yükleme kategorisi aynı kategoriyi kullanabilir" burada anlamsız ... – abzarak