2011-11-18 4 views
0

이것은 EF에 대한 나의 첫 경험이므로 어리석은 짓을하고있을 것입니다. 아키텍처에 대한 모든 의견은 환영받습니다.EF 4 사용자 지정 저장소

그래서 나는 전형적인 클래스의 사용자를 가지고 있습니다.

public class User 
{ 
    public string UserID{ get; set; } 
    public List<Role> Roles { get; set; } 
    public int Id { get; set; } 
    public User() 
    { 
     Roles = new List<Role>(); 
    } 
} 

내 도메인 객체가 자신의 저장소에 대한 인터페이스와 함께 자신의 코드 라이브러리에 살고 : 사용자는 사용자 이름과 역할의 목록을 가지고있다. 따라서이 경우 모든 CRUD 메소드와 필요한 특수 데이터 액세스 메소드가있는 IUserRepository가 있습니다. 내가 뭘 하려는지 다른 클래스 라이브러리의 EF4와 함께 이러한 저장소 인터페이스를 구현하는 것입니다. 지금까지이 디자인에 문제가 있습니까?

이제 db (sql 서버)에는 Users, Roles 및 UsersRoles 역할에 사용자를 매핑하는 다 대다 테이블이 있습니다.

EF 라이브러리에서 대부분의 CRUD 메소드를 성공적으로 설정했습니다. 저장 방법은 다음과 같습니다.

public void Save(Drc.Domain.Entities.Staff.User member) 
    { 
     using (var ctx = new DrcDataContext()) 
     { 
      var efUser = MapFromDomainObject(member); 
      if(member.Id < 1) 
      {      
       ctx.Users.AddObject(efUser);      
      } 
      else 
      {        
       ctx.Users.Attach(efUser); 
       ctx.ObjectStateManager.ChangeObjectState(efUser, EntityState.Modified); 
      }   
      ctx.SaveChanges(); 
      member.Id = efUser.UserId;     
     }    
    } 

이제는 이것이 올바른 방법이지만 작동하는지 잘 모르겠습니다. 그러나 삭제를 수행 할 때 문제가 발생합니다. 관련된 테이블에 문제가 있습니다

public void Delete(Drc.Domain.Entities.Staff.User member) 
    { 
     using (var ctx = new DrcDataContext()) 
     { 
      var efUser = MapFromDomainObject(member); ctx.Users.Attach(efUser); 
      while (efUser.Roles.Count > 0) 
      { 
       ctx.ObjectStateManager.ChangeObjectState(efUser.Roles.First(), EntityState.Deleted); 
      }       
      ctx.SaveChanges(); 
      ctx.ObjectStateManager.ChangeObjectState(efUser, EntityState.Deleted); 
      ctx.SaveChanges(); 
     } 
    } 

while 루프에서 역할을 삭제하지 않으면 참조 제약 조건과 DELETE 충돌이 발생합니다. 위의 코드를 실행하면 다 대다 테이블에서 적절한 행이 삭제되지만 역할 테이블의 행도 삭제됩니다. 지금 막 다른 골목에있어 ORM 아이디어를 고치고 내 저장소 구현을 좋은 OL 신뢰할 수있는 ADO.net에 작성하는 것을 고려합니다.

- 편집이 방법이 EF를 사용하여 리포지토리를 구현하는 올바른 방법이 아니라고 생각합니다. EF 중심의 자료로 도메인을 정리하지 않고도 할 수 있습니까?

+0

더 많은 문제가 전체 부착/분리 기능에 있다고 생각합니다. 실제로 컨텍스트 내에서 데이터베이스에서 개체를 가져 와서 값을 수정해야합니다. 당신은 정말로 롤을 지워야 만합니다. efUser를 삭제해야합니다. (EF와 db에서 표시된 캐스케이드 삭제를 확인하십시오.) –

+0

나는 이것에 대해 생각했지만 삭제하고 싶은 사용자를 얻기 위해 데이터베이스를 치고 싶지 않았습니다. 나는 내가 어쨌든 그것을 삭제하려고 할 것 같아요 그래서이 잘 시도했다 – cdaq

+0

내가이 방법을 사용하는 경우, 나는 또한 저장하기 전에해야 할 것입니다. 이 문제를 해결하려면 올바른 방법이 아닙니다. – cdaq

답변

0

를 사용하여 단순히 표준 접근 방식과 엔터티 상태와 주위하지 않는 엉망 :

public void Delete(Drc.Domain.Entities.Staff.User member) 
{ 
    using (var ctx = new DrcDataContext()) 
    { 
     var efUser = MapFromDomainObject(member); 
     ctx.Users.Attach(efUser); 
     ctx.Users.DeleteObject(efUser); 
     ctx.SaveChanges(); 
    } 
} 

는, 당신은하지 않았다 경우 계단식은 (조인 테이블에 User 테이블에서 데이터베이스에서 삭제 일반적으로이 손으로 그것을 무능하게하십시오). 따라서 사용자를 삭제하면 조인 테이블의 해당 행도 삭제됩니다 (물론 역할은 제외).

엔터티의 상태를 Deleted으로 설정하는 것은 DeleteObject을 호출하는 것과 다릅니다. 부모 만 삭제하도록 설정하고 컨텍스트에서 자식을 삭제되지 않은 상태로 둡니다. 이로 인해 제약 조건 위반 예외가 발생합니다. DeleteObject도 컨텍스트에서 자식을 Deleted으로 표시하므로 예외가 발생하지 않습니다.

+0

감사합니다. Slauma this works. 또한 m : m 테이블에 대한 연쇄 삭제를 설정해야했습니다. 기본적으로 해제되어 있습니다. 나는 이것이 내가 들어가기를 원하는 방향이라고 확신하지 못한다. – cdaq