2013-07-11 1 views
0

이상한 일이 발생합니다. UserGroups라는 테이블과 일대 다 관계가있는 Group이라는 테이블이 있습니다.윌. 엔티티 프레임 워크를 제거하면 기본적으로 캐스케이드 삭제가 수행됩니다.

이제 Entity Framework .Remove 메서드를 사용하십시오. 사용자가있는 그룹을 삭제할 수 있지만 데이터베이스에서 직접 비슷한 작업을 수행하려고하면 예외가 발생합니다 (그룹에 하위 레코드가 있습니다 !!!).

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

내가 찾기 방법에 이후이 그룹과 두 개의 탐색 속성을 검색하고 두렵다

액션 방법으로 보인다 , 이것은 .Delete가 thses 탐색을 먼저 제거하고 Group 객체를 제거한다는 것을 의미합니다 !!!!

I 두 방법을 정의

EDIT; 찾기 및 찾기 : -

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

그래서 다른 제안 사항이 있으십니까?

답변

0

예.

당신은 가상 또는 외국 id 필드를 사용하는에 따라 :

public virtual Category {get; set;} 

또는

public Guid CategoryId {get;set:} 

데이터베이스 테이블 필드의 특성 Allow Null에 설정되어있는 것을 변경됩니다 볼 수있는 테이블 디자이너를 확인 . 가상은 그것을 true로 설정하고 Allow Null 외래 키 필드는 거짓으로 설정합니다 Allow Null. 두 항목을 결합하면 false로 설정됩니다. 나는 당신이 그들을 결합 할 것을 권합니다. 이것은 당신이 명시 적으로 데이터베이스로부터 다시 호출 할 필요없이 서브 엔티티를 끌어낼 수있게 해주기 때문입니다. 따라서 Cascade On Delete을 비활성화하려면 ? 연산자를 사용하여 외래 키 필드를 null로 설정해야합니다. 아래를 참조

그래서, 당신은 그냥 할 경우 :

public virtual Category {get;set;} 

그것은 데이터베이스 테이블에서 Category_Id 필드에 Allow Null을 설정합니다.

당신이 할 경우

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

설정

나는를 사용합니다.을 기본 키 필드로 사용하지만 여전히 Int과 작동합니다.당신이 Guid를 사용하는 방법을 궁금해하는 경우이 어떻게 (개인적으로는 기분) : 답장을

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid Id {get;set;} 
+0

감사합니다,하지만 난이 문제를 가지고 모든 개체를 수정하는 믿을 수있을 것입니다 생각하지 않습니다. –

+0

신뢰할 수 있다는 것은 무엇을 의미합니까? 엔티티를 만들 때 forein 키와 가상 속성을 모두 사용하여 최대한의 제어를 제공해야합니다. –

+0

위의 편집을 참조하십시오. 필자는 두 가지 Find 메서드를 정의 할 것이다. Group 개체 만 반환하고 삭제에 사용되며 다른 개체는 모든 탐색 속성이 포함 된 Group 개체를 검색하고 개체 세부 정보를 사용하거나 볼 수 있습니다. –

관련 문제