이것은 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 중심의 자료로 도메인을 정리하지 않고도 할 수 있습니까?
더 많은 문제가 전체 부착/분리 기능에 있다고 생각합니다. 실제로 컨텍스트 내에서 데이터베이스에서 개체를 가져 와서 값을 수정해야합니다. 당신은 정말로 롤을 지워야 만합니다. efUser를 삭제해야합니다. (EF와 db에서 표시된 캐스케이드 삭제를 확인하십시오.) –
나는 이것에 대해 생각했지만 삭제하고 싶은 사용자를 얻기 위해 데이터베이스를 치고 싶지 않았습니다. 나는 내가 어쨌든 그것을 삭제하려고 할 것 같아요 그래서이 잘 시도했다 – cdaq
내가이 방법을 사용하는 경우, 나는 또한 저장하기 전에해야 할 것입니다. 이 문제를 해결하려면 올바른 방법이 아닙니다. – cdaq