2012-02-11 4 views
11

मैं एमवीसी के लिए काफी नया हूं और मुझे कैस्केड हटाने के साथ परेशानी हो रही है। अपने मॉडल मैं निम्नलिखित 2 वर्गों के लिए:एमवीसी .Net कैस्केड ईएफ कोड का उपयोग करते समय हटाना पहला दृष्टिकोण

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; } 

    } 

और मेरे नियंत्रक के लिए मैं वह वापस हटाने पोस्ट पर निम्नलिखित सेट:

[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"); 
} 

समस्या यह अभ्यस्त कोई बात नहीं क्या काम है, I read this post लेकिन मुझे केवल उन मॉडलों के लिए काम करना प्रतीत होता है जहां संबंध एक से एक है, इसलिए मैं यहां खो गया हूं, मैंने हर जगह खोज की है, और इस समस्या का समाधान नहीं मिल रहा है, अगर कुछ बता सकते हैं कि मैं क्या खो रहा हूं यह वास्तव में अच्छा होगा :), अग्रिम धन्यवाद, और फिर, मेरी नोबॉनेस क्षमा करें, मैं अभी शुरू कर रहा हूं, लेकिन बहुत सी सीखने में सक्षम होने के लिए एक बड़ी परियोजना से निपटना चाहता था।

उत्तर

15

है ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप से एफई झरना हटाए गए लागू नहीं करता है वैकल्पिक संबंधों के लिए। आपके मॉडल में संबंध वैकल्पिक के रूप में अनुमानित है। एक

आप 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; } 
} 

के एक गैर नल अदिश संपत्ति (BlogId) इस का उपयोग कर धाराप्रवाह एपीआई

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

हाँ! : डी, ​​धन्यवाद यह काम करता है !, बहुत बहुत धन्यवाद, मैं सिर्फ धाराप्रवाह एपीआई से अवगत नहीं था, लेकिन इस सामान को करने के लिए एक अच्छा तरीका प्रतीत होता है, वैसे ही मैं इस व्यवहार को डेटा एनोटेशन के साथ प्राप्त कर सकता हूं? –

+0

@Q_ro डेटा एनोटेशन में सुविधाओं का सीमित सेट है। – Eranga

1

यकीन नहीं अपने यहां यही प्रयास है, लेकिन आप एक रिकॉर्ड ऐसा नहीं है यकीन है कि क्यों अपने पाश यहाँ की कोशिश कर मेरी हटाने कोड है क्या:

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"); 
      } 
    } 
+0

ठीक है, इसे इस तरह, प्रत्येक उत्पाद लगता है जोड़ने या कॉन्फ़िगर कर सकते हैं, है श्रेणी, मैं उन श्रेणियों को भी हटाना चाहता हूं जब मैं एक उत्पाद हटा देता हूं, 'कारण, जैसा कि अब है, अगर मैं कोई उत्पाद हटा देता हूं, तो मेरी श्रेणियां डेटाबेस पर भी रहेंगी। –

+0

हाँ, लेकिन आपका कोड केवल उस कोड को दिखाएगा जिसमें श्रेणियां हैं, आपको श्रेणियों और वस्तुओं के लिए एक सक्षम/अक्षम कॉलम भी होना चाहिए, अनिवार्य रूप से आपको वास्तव में कुछ भी नहीं हटा देना चाहिए, लेकिन हटाए गए अनुसार चिह्नित करें, इससे बाद में समस्याएं कम हो जाती हैं जहां एक आईडी का संदर्भ दिया जाता है लेकिन अब मौजूद नहीं है। यदि आप चाहते हैं कि आप ऑब्जेक्ट से श्रेणी आईडी प्राप्त कर सकते हैं, तो श्रेणी को हटाएं और फिर मूल ऑब्जेक्ट को हटाएं लेकिन आपको वास्तव में सब कुछ हटाने के बजाय इसके साथ बेहतर सौदा करने के लिए कोड लिखना चाहिए :-) – davethecoder

+0

सलाह के लिए धन्यवाद, मैं इसे ध्यान में रखेगा :)। –

संबंधित मुद्दे