2012-02-11 9 views
11

私はMVCには新しく、カスケード削除には問題があります。私のモデルI以下の2クラスの場合:MVC .NetカスケードEFコードを使用しているときの削除First Approach

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しかし、私は関係が1対1であるモデルのためだけに働くように見えるので、私はここで失われている、私はどこでも検索があり、何かが欠けていることを指摘できる場合、この問題の解決策を見つけることができないそれは本当に素晴らしいだろう:)前もって感謝し、再び、私のnooobnessを赦す私はちょうど始めているが、たくさんのことを学ぶことができる大きなプロジェクトに取り組みたい。

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

答えて

15

EFは、デフォルトでは、カスケード削除を強制していないためである:あなたがここでやろうとしているが、ここではループにしようとすると、私の削除コードあなたはなぜそんなに必ず一つのレコードを持っていないものを

+0

よろしく! :D、ありがとう、それは働いた!、ありがとう、私はちょうど流暢なAPIを認識していませんでしたが、このようなことを行う良い方法のように思えますが、私はデータの注釈でこの動作を得ることができますか? –

+0

@Q_roデータアノテーションには機能が限定されています。 – Eranga

1

わかりませんオプションの関係の場合。モデル内の関係はオプションとして推論されます。

あなたが持っている、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; } 
} 

それとも、それをこのように考えて、まあ

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

各製品を使用してこの流暢なAPIを構成する非NULL可能スカラプロパティ(BlogId)を追加することができますカテゴリを削除すると、商品を削除するときにカテゴリを削除したいので、商品が削除された場合でもカテゴリはデータベースに残ります。 –

+0

ええ、あなたのコードではカテゴリを含むコードだけを表示する必要があります。カテゴリーやアイテムにも有効/無効の列を設定する必要があります。実際には何も削除しないでください。もはや存在しない。オブジェクトからカテゴリIDを取得することはできますが、カテゴリを削除して元のオブジェクトを削除することもできますが、すべてを削除するのではなく、実際にコードを書く必要があります:-) – davethecoder

+0

アドバイスありがとうございますそれを覚えておいてください:)。 –

関連する問題