0

何か奇妙なことが起こります。UserGroups という名前のテーブルと 1 対多の関係を持つ Group という名前のテーブルがあります。

Entity Framework .Remove メソッドを使用するようになりました。ユーザーを含むグループを削除することはできますが、データベースで直接同様の操作を実行しようとすると、例外が発生します (グループに子レコードがあること!!!) 何が起こっているのかわかりません!!!.

Action メソッドは次のようになります:-

[HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            try
            {
                var v = groupRepository.Find(id).Name;

                groupRepository.Delete(id);
                groupRepository.Save();
                return Json(new { IsSuccess = "True", id = id, description = v }, JsonRequestBehavior.AllowGet);
              //  return RedirectToAction("Index");
            }
            catch (NullReferenceException)
            {
                //ModelState.AddModelError(string.Empty, " The record might have been already deleted.Please refresh the page.");
                return Json(new { IsSuccess = "False" }, JsonRequestBehavior.AllowGet);

            }
return RedirectToAction("Delete", new { id = id});
        }

リポジトリのメソッドは次のとおりです。

public void Delete(int id)
        {
            var group = context.Groups.Find(id);
            context.Groups.Remove(group);
        }

public Group Find(int id)
        {

            return context.Groups.Where(c => c.GroupID == id).Include(a => a.UserGroups)
                .Include(a2 => a2.SecurityRoles).SingleOrDefault();
        } 

残念ながら、Find メソッドで Group とその 2 つのナビゲーション プロパティを取得しているため、.Delete は最初にこれらのナビゲーションを削除し、次に Group オブジェクトを削除することを意味します !!!!

編集

2 つのメソッドを定義しました。検索とすべてを検索:-

public Group Find(int id)
        {

            return context.Groups.Find(id) ;
        }
        public Group FindAll(int id)
        {

            return context.Groups.Where(c => c.GroupID == id).Include(a => a.UserGroups)
                .Include(a2 => a2.SecurityRoles).SingleOrDefault();
        }

他の提案はありますか??

4

1 に答える 1

0

はい、そうなります。

使用する仮想 ID フィールドまたは外部 ID フィールドに応じて、次のようになります。

public virtual Category {get; set;}

また

public Guid CategoryId {get;set:}

データベース テーブル フィールドのプロパティに設定されている内容が変更されAllow Nullます。テーブル デザイナーに確認してください。仮想はそれを true に設定し、Allow Null次に外部キー フィールドはそれを false に設定しますAllow Null。それらを組み合わせると、それでも false に設定されます。これらを組み合わせることをお勧めします。これにより、データベースから再度明示的に呼び出すことなく、サブエンティティをプルできるようになります。したがって、確実に無効にするには、演算子Cascade On Deleteを使用して外部キー フィールドを null に設定する必要があります。?下記参照:

したがって、次のようにすると:

public virtual Category {get;set;}

データベーステーブルのフィールドに設定さAllow Nullれます。Category_Id

もしあなたがそうするなら:

public Guid CategoryId {get;set;}
public virtual Category Category {get;set;}

フィールドを作成CategoryIdし、設定しませんAllow Null

しかし、そうする場合:

public Guid? CategoryId {get;set;}
public virtual Category Category {get;set;}

フィールドを作成CategoryIdして設定しますAllow Null

私はGuid主キー フィールドとして使用しますが、これは引き続きInt. どのように使用するのか疑問に思っている場合Guid(個人的にはその方が良いと感じています)、次のようにします。

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id {get;set;}
于 2013-07-11T10:32:09.787 に答える