2009-04-02 6 views
0

다른 사람들이 다음 시나리오에 어떻게 대처하는지 배우고 싶습니다.데이터베이스 지속성을위한 C# 객체 평등화

이것은 숙제가 아니거나 어떤 종류의 과제도 아닙니다. 예제 클래스는 내 질문을 더 잘 설명하기 위해 만들어졌지만 피드백을 보내고 싶은 실제 시나리오를 반영합니다.

우리는 데이터베이스에서 모든 데이터를 검색하여 개체에 배치합니다. 객체는 하나의 레코드를 나타내며 데이터베이스에 여러 레코드가있는 경우 데이터를 레코드 객체의 List <>에 배치합니다.

다음과 같은 클래스가 있다고 가정 해 보겠습니다.

public class Employee 
    { 
     public bool _Modified; 
     public string _FirstName; 
     public string _LastName; 
     public List<Emplyee_Address> _Address; 
    } 

    public class Employee_Address 
    { 
     public bool _Modified; 
     public string _Address; 
     public string _City; 
     public string _State; 
    } 

명료하게하기 위해 Getters와 Setters가 클래스에서 생략되었습니다. 어떤 코드 경찰이 나를 사용하지 않는다고 비난하기 전에이 예를 빠뜨린 것입니다.

데이터베이스에는 Employees에 대한 테이블과 Employee Addresses에 대한 테이블이 있습니다.

개념적으로 데이터베이스 테이블의 데이터를 나타내는 List 개체를 만드는 것입니다. 우리는 프런트 엔드의 컨트롤에 바인드하는이 오브젝트의 딥 클론을 수행합니다. 그런 다음 데이터베이스의 데이터를 나타내는 두 개의 객체 (Orig 및 Final)가 있습니다.

사용자는 레코드를 생성, 수정, 삭제하여 "최종"개체를 변경합니다. 그런 다음 이러한 변경 사항을 데이터베이스에 유지하려고합니다.

분명히 우리는 가능한 한 우아하고 편집, 생성, 삭제가 필요한 레코드를 삭제하고자합니다.

우리는 궁극적으로 우리가 할 수 있도록 두 개의 List 객체를 비교하려고합니다.

  1. 변경 사항이 데이터베이스에 유지 될 수 있도록 변경된 특성을 확인하십시오.

  2. 두 번째 목록 <에 더 이상 존재하지 않는 속성 (레코드)이 있는지 확인하여 이러한 레코드를 데이터베이스에서 삭제할 수 있습니다.

  3. 새 목록 <에 새 속성이 있는지 확인하여 데이터베이스에 만들 수 있습니다.

우리가 가장 잘 수행 할 수있는 방법에 대해 공을 굴리는 사람. 최상위 속성뿐만 아니라 변경 사항을 확인하기 위해 Employee_Address 목록을 드릴 다운해야합니다.

나는 분명히하고 희망을 갖기를 바랍니다.

답변

0

.NET이 정확히 System.Data.DataRowState을 염두에두고있는 레코드 상태와 하나의 객체에있는 모든 관련 버전을 유지하는 클래스의 Data 클래스에서 똑같은 작업을 수행합니다.

이 방법 :

  • 당신은 그것을 수정, 삽입, 삭제, 또는 여전히 원래의 기록이다되었는지 여부를 한 눈에 알 수 있습니다.
  • 이전 버전을 찾기 위해 다른 모음집을 파지하지 않고 새 버전과 이전 버전을 쿼리하여 변경된 사항을 빠르게 찾을 수 있습니다.
0

왜 두 목록 개체를 비교 하시겠습니까? 본질적으로 중복되는 데이터에 대해 많은 메모리를 사용하게 될 것입니다.

특정 개체가 새로 만들기, 삭제 된 또는 변경된 경우 알려줄 수있는 각 개체의 상태 속성을 제안하는 것이 좋습니다. 속성을 Enum으로 설정하는 것보다 더 원하는 경우, 변경 될 내용이 포함 된 Dictionary를 포함하는 개체로 만들 수 있습니다. 그러나 변경된 상태의 경우에만 적용될 가능성이 높습니다.

당신이 그런 속성을 추가 한 후에는 등 당신은 엔티티 프레임 워크는 이런 종류의 작업을 수행하는 방법을 확인 할 수 있습니다

을 지운 개체를 제거, 새 개체를 추가, 목록을 통과하기 쉽게한다 뿐만 아니라.

0

Identity Map 패턴의 사용을 조사해야합니다. Unit of Work과 함께 사용하면 데이터베이스에 저장할 필요가있는 객체를 확인하고 읽을 때 정렬 할 객체의 "캐시"를 유지 관리 할 수 ​​있으므로 새 객체를 만들고 반환하는 대신 ID 맵에서 객체를 반환 할 수 있습니다.

1

nullable ObjectID 필드를 레이어의 기본 유형에 추가하십시오. 프론트 엔드에 전달하고 특정 인스턴스가 데이터베이스에 지속되는지 확인합니다. 아이덴티티 맵이 없어도 다른 용도로 많이 사용됩니다