2011-08-26 5 views
5

상황은 엔터티를 모델링하는 테이블이 있습니다. 이 엔터티에는 여러 속성 (각 속성은 테이블의 열로 식별 됨)이 있습니다. 문제는 앞으로 새로운 속성을 추가하거나 속성을 제거해야한다는 것입니다. 문제는 데이터베이스와 해당 코드 (C# 사용)를 모두 모델링하여 그러한 경우에 새로운 속성을 "소유"하는 것이 매우 쉽다는 것입니다.일반 및 데이터베이스 - 디자인 문제

처음에는 속성이 하나 뿐이므로 한 개의 열만있었습니다. 클래스의 해당 속성을 적절한 형식과 이름으로 정의한 다음이를 읽고 수정하는 저장 프로 시저를 만들었습니다. 그런 다음 신속하게 복사 붙여 넣기, 두 번째 속성 변경, 이름 및 유형 변경, 그리고 약간의 SQL이있었습니다. 분명히 이것은 앞으로 적합한 모델이 아닙니다. 이번에는 ORM (EF 또는 다른 것)을 제안 할 수도 있습니다. 왜냐하면 이것이 SQL과 코드를 자동으로 생성 할 것이기 때문입니다. 그러나 현재로서는 이것이 나를위한 옵션이 아닙니다.

하나의 속성 (속성 이름)을 읽는 절차와 이름 및 값으로 업데이트하는 절차가 하나만 있다고 생각한 다음 동일한 문에서 엔터티에 대한 묶음 또는 모든 속성을 읽는 일반 절차 . 제네릭 사용을 고려해 볼 때 C#에서는 쉽게 들릴 수 있지만 데이터베이스는 제네릭을 알지 못하므로 강력한 형식화 된 솔루션을 사용할 수 없습니다.

저는 가능한 한 강력하게 형식화 된 솔루션을 갖고 싶습니다. 따라서 많은 캐스팅 및 구문 분석을 수행 할 필요가 없습니다. 코드에서 사용 가능한 속성을 정의하여 사용 가능한 문자열을 추측하지 않고 마법 문자열 등을 사용하지 마십시오. 그런 다음 시스템에 새 속성을 추가하는 과정은 테이블에 새 열을 추가하고 코드 (예 : 열거 형)에 새 속성 "정의"를 추가하는 것을 의미합니다.

+0

EF를 사용할 수없는 이유는 무엇입니까? 마이크로 소프트의 천재들은 이미이 점에 대해 많은 것을 알고 있습니다. 나는 당신이 바퀴를 다시 발명하는 것을 싫어한다. – Jay

+0

그래, 나는 왜 당신이 ORM을 피할 필요가 있는지 이해하지 못한다. (또한 C# generics가이 중 어떤 것을 수행해야하는지 전혀 알지 못합니다.) –

+0

EF는 아키텍처와 관련하여 조금 더 멀리 떨어져 있지만 아직 사용할 수 없습니다. – CyberDude

답변

2

소리가 난다 :

MyObj x = new MyObj(); 
x.SomeProperty = 10; 

당신은 그것을 위해 만든 테이블이 있지만

x.AnotherProperty = "Some String"; 

당신이 필요 추가 할 때 해당 테이블을 변경 유지하려는 해달라고 다음과 같이 테이블 데이터를 정규화하십시오.(이렇게) 테이블 데이터를 정규화하십시오.

public class MyObj 
{ 
     public int Id { get; set; } 
     public int SomeProperty { get; set; } 
     public string AnotherProperty { get; set; } 
} 

DL에서 개체를 만들 때 레코드 집합을 열거합니다. 그런 다음 구성과 동일한 이름으로 속성을 검사하는 코드를 작성한 다음 (BaseTableProperty.Name == MyObj.<PropertyName>) 레코드 세트를 열거하면서 해당 유형으로 유형 변환을 시도하십시오.

그런 다음 다른 속성을 개체, BaseTableProperty에서 데이터베이스에 또 다른 기록을 한 다음 BaseTableValue에 그 사람에 대한 값을 저장할 수

예 :.

RecordId 
======== 
1 

PropertyId   Name 
==========   ==== 
1     SomeProperty 

ValueId  RecordId  PropertyId  Value 
=======  ========  ==========  ===== 
1   1    1    100 

당신은 두 개의 결과 집합, 기본 데이터를위한 하나, 하나가 합류 속성 및 값 테이블에서.각 레코드를 열거 할 때 SomeProperty의 이름을 볼 수 있습니다 - typeof(MyObj).GetProperty("SomeProperty")이 있습니까? 예? 데이터 유형은 무엇입니까? int? 좋아, 다음 속성을 설정하여 int에 "100"을 변환하려고 : 각 속성에 대한

propertyInfo.SetValue(myNewObjInstance, Convert.ChangeType(dbValue, propertyInfo.PropertyType), null); 

합니다.

+0

닫기가되었지만 클래스의 각 속성을 실제로 선언하고 싶지는 않습니다. 한 번에 둘 이상의 속성이 필요한 경우는 거의 없습니다. 대부분의 경우 개체 ID가 있으며 속성 중 하나만 알 필요가 있습니다. 그래서 일반적인 'GetProperty (int objectID, string propertyName)'메소드를 사용하게되었습니다. – CyberDude

+0

내가 받아 들일 해결책에 가장 가까운이 사실을 받아 들일 것입니다. – CyberDude

0

당신이 사용할 수 없다고해도, 그것은 대부분의 ORM이하는 일입니다. 사용하는 프로그램에 따라 (또는 학습 경험이 있다면 작성), 복잡성과 성능이 크게 달라집니다. 경량 ORM을 선호하는 경우 Dapper.Net을 확인하십시오. 제네릭도 사용하므로 코드를 확인하고 작동 방식을 확인하고 필요한 경우 코드를 직접 만들 수 있습니다. 이 작업을 수행 할 같은