2011-01-16 3 views
1

테이블 Case과 다른 테이블 CaseReplies 사이에 일대 다 관계가 있습니다. 저는 EF Code First를 사용하고 있으며 이제는 Case 객체에서 CaseReply을 삭제하려고합니다.하지만 CaseId를 특정 CaseReply 레코드에서 제거하려고 시도하기 때문에 불가능합니다.처음 EF 코드 + 부모 개체에서 자식 개체 삭제?

나는 행운없이 데이터베이스 수준에서 계단식 삭제/업데이트를 설정하려고 시도했습니다 ...

short : Case는 자체와 CaseReply 사이의 관계를 제거합니다. CaseReply는 삭제하지 않습니다.

내 코드 :

// Case.cs (케이스 개체)

public class Case 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Topic { get; set; } 

    public string Message { get; set; } 

    public DateTime Date { get; set; } 

    public Guid UserId { get; set; } 

    public virtual User User { get; set; } 

    public virtual ICollection<CaseReply> Replies { get; set; } 
} 

// CaseReply.cs (CaseReply 개체)

public class CaseReply 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Message { get; set; } 

    public DateTime Date { get; set; } 

    public int CaseId { get; set; } 

    public Guid UserId { get; set; } 

    public virtual User User { get; set; } 

    public virtual Case Case { get; set; } 
} 

// RepositoryBase.cs

public class RepositoryBase<T> : IRepository<T> where T : class 
{ 
    public IDbContext Context { get; private set; } 
    public IDbSet<T> ObjectSet { get; private set; } 

    public RepositoryBase(IDbContext context) 
    { 
     Contract.Requires(context != null); 

     Context = context; 

     if (context != null) 
     { 
      ObjectSet = Context.CreateDbSet<T>(); 

      if (ObjectSet == null) 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 

    public IRepository<T> Remove(T entity) 
    { 
     ObjectSet.Remove(entity); 
     return this; 
    } 

    public IRepository<T> SaveChanges() 
    { 
     Context.SaveChanges(); 
     return this; 
    } 
} 

// CaseRepository.cs

public class CaseRepository : RepositoryBase<Case>, ICaseRepository 
{ 
    public CaseRepository(IDbContext context) 
      : base(context) 
    { 
     Contract.Requires(context != null); 
    } 

    public bool RemoveCaseReplyFromCase(int caseId, int caseReplyId) 
    { 
     Case caseToRemoveReplyFrom = ObjectSet.Include(x => x.Replies).FirstOrDefault(x => x.Id == caseId); 
     var delete = caseToRemoveReplyFrom.Replies.FirstOrDefault(x => x.Id == caseReplyId); 

     caseToRemoveReplyFrom.Replies.Remove(delete); 

     return Context.SaveChanges() >= 1; 
    } 
} 

미리 감사드립니다.

+0

유창한 API 코드를 포함하여 개체 모델을 게시하십시오. –

+0

CaseRepository에서 사용 된 개체 모델로 게시물을 업데이트했습니다. – ebb

+1

이것은 불가능합니다. 협회가 필요하기 때문에 제거 결과로 예외를 받아야합니다. caseReply * 클래스의 * CaseId * 클래스가'int'가 아닌'int' 타입인지 확신합니까? –

답변

1

부모 개체 컬렉션에서 EF가 CaseReply을 제거 할 때 DB에서 제거하려면 식별 관계를 사용해야합니다. CaseReply에는 IdCaseId 열을 기반으로하는 복합 기본 키가 있어야합니다.

+0

CaseReply 테이블에 Id (기본 키와 식별자) 및 CaseId (PK) 열이 있습니다. – ebb

+0

매핑에이 ID가 없습니다. 데이터베이스에있는 것이 중요하지 않습니다. 코드 우선 매핑에서 정의한 것이 중요하며 Id에만 Key 속성 만 있습니다. –

+0

나는 그걸 시도했지만 여전히 그 관계 만 제거하고 그 대상은 제거하지 않는다 ... – ebb

0

EF CT4를 사용하고 있다고 생각합니까? 나는 똑같은 문제가 있었고 그것을 싫어했다. 나는 당신의 코드가 완벽하다고 생각합니다.

연결이 일대일 관계이므로 유일한 해결책은 데이터베이스 쪽에서 계단식 삭제를 설정하는 것입니다. < http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx>

위의 해결 방법은 상위 레코드를 삭제할 때 고아를 삭제하는 데 사용됩니다. 나는 그것이 당신의 문제도 해결할 수 있기를 바랍니다.

0

문맥에서 제거해야합니다. db에서 삭제하려면 회신하십시오. 지금하고있는 일은 연결을 제거하는 사례의 답글 모음에서 제거하는 것입니다. 따라서 전화해야합니다 :

context.Replies.Remove(delete) 
관련 문제