2012-02-11 14 views
11

MVC'ye oldukça yeniyim ve kaskat silme ile ilgili sorun yaşıyorum. Benim modeli I aşağıdaki 2 sınıfları için:MVC .Net Cascade EF Kodu Kullanırken Silme İlk Yaklaşım

public class Blog 
    { 
     [Key] 
     public int Id { get; set; } 
     [Required] 
     public string Name { get; set; } 
     [DisplayFormat()] 
     public virtual ICollection<BlogEntry> BlogEntries { get; set; } 
     public DateTime CreationDateTime { get; set; } 
     public string UserName { get; set; } 
    } 

    public class BlogEntry 
    { 
     [Key] 
     public int Id { get; set; } 
     [Required] 
     public string Title { get; set; } 
     [Required] 
     public string Summary { get; set; } 
     [Required] 
     public string Body { get; set; } 
     public List<Comment> Comments { get; set; } 
     public List<Tag> Tags { get; set; } 
     public DateTime CreationDateTime { get; set; } 
     public DateTime UpdateDateTime { get; set; } 
     public virtual Blog ParentBlog { get; set; } 

    } 

Ve denetleyicisi için geri silme yayında şu he ayarlayın:

[HttpPost, ActionName("Delete")] 
public ActionResult DeleteConfirmed(int id) 
{ 
    Blag blog = db.Blogs.Find(id); 

    foreach (var blogentry in blog.BlogEntries) 
    { 
     //blogentry = db.BlogEntries.Find(id); 
     db.BlogEntries.Remove(blogentry); 
    } 
    db.Blogs.Remove(blog); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

Sorun alışkanlık ne olursa olsun çalışmak olduğunu; I read this post ama sadece ilişkinin birebir olduğu modeller için çalışıyorum, bu yüzden burada kayboldum, her yerde arama yaptım ve bazılarının eksik olduğumu göstermesi durumunda bu sorunun çözümü bulunamıyor. Bu gerçekten çok güzel olurdu :), şimdiden teşekkürler, ve yine, benim nooobness için özür dilerim sadece başladım, ama çok şey öğrenebilmek için büyük bir proje ile uğraşmak istedim.

public ActionResult Delete(int id) 
    { 
     try { 
     Products products = context.Products.Single(x => x.productId == id); 
     return View(products); 
     } 
     catch (Exception ex) 
      { 
      ModelState.AddModelError("",ex.Message); 
      CompileAndSendError(ex); 
      return View(new Products()); 
      } 
    } 

    // 
    // POST: /Products/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    { 
     try { 
     Products products = context.Products.Single(x => x.productId == id); 
     context.Products.Remove(products); 
     context.SaveChanges(); 
     return RedirectToAction("Index"); 
     } 
     catch (Exception ex) 
      { 
      ModelState.AddModelError("",ex.Message); 
      CompileAndSendError(ex); 
      return RedirectToAction("Index"); 
      } 
    } 

cevap

15

EF varsayılan olarak kaskad siler zorlamaz çünkü: senin burada yapmaya çalıştığımız, ama burada döngü çalışırken benim silmek kod senin neden bu kadar emin bir kayıt değil ne

+0

Yay! : D, işe yaradı !, çok teşekkürler, sadece akıcı API'nin farkında değildim, ama bu şeyi yapmanın iyi bir yolu gibi görünüyor, bu arada bu davranışı veri ek açıklamalarıyla alabilir miyim? –

+0

@Q_ro Veri ek açıklamalarında sınırlı özellik kümesi vardır. – Eranga

1

emin isteğe bağlı ilişkiler için. Modelinizdeki ilişki isteğe bağlı olarak çıkar.

Sen

modelBuilder.Entity<BlogEntry>() 
      .HasRequired(b => b.ParentBlog) 
      .WithMany(b => b.BlogEntries) 
      .WillCascadeOnDelete(true); 
+0

Eh, Şöyle, her bir ürünü düşünmek bu kullanarak akıcı API FK

public class BlogEntry { [Key] public int Id { get; set; } [Required] public string Title { get; set; } [Required] public string Summary { get; set; } [Required] public string Body { get; set; } public List<Comment> Comments { get; set; } public List<Tag> Tags { get; set; } public DateTime CreationDateTime { get; set; } public DateTime UpdateDateTime { get; set; } public int ParentBlogId { get; set; } public virtual Blog ParentBlog { get; set; } } 

olmayan bir null sayıl özelliği (BlogId) ekleyin Ya yapılandırabilir, sahip bir kategori, bir ürünü sildiğimde de bu kategorileri silmek istiyorum, çünkü bir ürünü silersem, kategorilerim hala veritabanında olacak. –

+0

Evet, ancak kodunuz yalnızca kategorileri içeren kodları göstermeli, ayrıca kategoriler ve öğeler için etkinleştirilmiş/devre dışı bırakılmış bir sütuna sahip olmalısınız, aslında hiçbir şeyi gerçekten kaldırmamalısınız, ancak silinmiş olarak işaretleyin, bu, daha sonra bir ID'nin başvurulduğu durumlarda sorunları azaltır; artık yok. Yine de kategori kimliğini nesneden alabilir, kategoriyi silebilir ve sonra orijinal nesneyi silebilirsin ama gerçekten her şeyi kaldırarak yerine daha iyi başa çıkmak için kod yazmalısın :-) – davethecoder

+0

tavsiye için teşekkürler, ben bunu aklında tutuyorum :). –