1

누구나 C# (.net 3.5) 도메인 모델에서 데이터베이스 스키마를 생성 한 경험이 있습니까? 어떤 도구가 가장 깨끗한 스크립트를 생성합니까?DomainModel의 데이터베이스 스키마

Telerik OpenAccess ORM은 괜찮 았지만 속성 필드에서 .net 3.5 암시 적 개인 필드를 사용하는 경우 C# 클래스에서 클린 열 이름을 생성하지 않습니다.

난 단지 수동으로 향상시키고 유지할 초기 스크립트 파일이 필요하다.

+0

는 도메인 모델 코드에 액세스 할 수 있습니까? 클래스와 속성에 속성을 추가 할 수 있습니까? –

+0

어쨌든 Ryan, 소스 코드에 액세스 할 수없는 경우 XML로 속성을 매핑 할 수 있습니다. 나처럼 xml을 마지막 옵션으로 사용한다면 IEnumerable 을 반환하는 각 도메인 클래스에 대한 확장 메서드를 만들 수 있습니다. –

답변

2

방금 ​​반사를 통해 하나를 생성했습니다. 놀랍게도 내가 상상했던 노력이 적어졌다. 한번 생각해 보니.

내가 그것을 어떻게 (일명 : 알고리즘)

  1. 로드 어셈블리. 어셈블리의 각 클래스 (유형) => 생성 테이블의 경우

  2. =이> 필드를 추가 생성 클래스의 각 취득/설정 속성에 대한 $ {클래스 명} ID

  3. 1 차 키를 생성합니다 (속성 유형을 데이터베이스 유형에 매핑)

  4. 클래스에 외래 키 사용자 정의 속성 가져 오기 => 존재하지 않는 경우 키 추가. fk_index로 (사용자 정의 속성을 설정 서명

  5. 하는 다른 제약 조건 (예를 들면 받기 [외래 키 ("TableA의, TableB의")]과 같다 : 확인) 사용자 정의 속성 => 생성 적절한

  6. 그렇게하지 않으면 소스 코드에 대한 액세스 권한이 있어야합니다. ***** 편집 : xml이 항상 나를위한 마지막 옵션 솔루션 인 경우 IEnumerable을 반환하는 클래스에 확장 메서드를 만들 수 있습니다. < 속성 > 이 경우 속성 표면에는 검사 및 고유 한 제약 조건에서 참조하는 필드 이름을 저장하기위한 'string TargetProperty {get; set;}'속성이 있어야합니다. *****

그게 전부 야 !!

팁 :

ASSEMBLY의 LOADING : 오! 그런데 하나의 공통적 인 문제는 로딩 프로그램에서 찾을 수있는 곳에 모든 어셈블리 종속성이 제공되는지 확인하는 것입니다. Visual Studio는이 동적로드 시나리오의 종속성을 해결하는 데 도움이 될 수 없음을 기억하십시오. 명령 줄에서 csc.exe를 실행하고 있다고 생각하십시오. 어셈블리로드 문제가 발생하면로드 프로그램에서 찾을 수있는 도메인 모델 어셈블리의 모든 내부 종속성을 사용할 수 있는지 확인하십시오.

유형 매핑 : Null 가능 유형은 NULL로 설정되고 그렇지 않으면 NULL로 설정됩니다. 문자열 유형은 nvarchar (max)로 설정됩니다. 십진수 또는 두 배로 원하는대로 돈을지도, bool을 비트 또는 이와 동등한 것으로 매핑, DateTime을 datetime에 매핑, byte []를 이진수로 매핑, long을 number (x, 0)에 매핑하고 int를 int로 매핑합니다.

APP 아키텍처 : 즉각적인 필요를 위해 내 솔루션에 콘솔 응용 프로그램을 추가하는 것은 쉽지만 입력 인수를 제공하여 다른 프로젝트로 쉽게 이식 할 수 있도록 할 수 있습니다.이것을 부드럽게하기 위해 code gen 프로그램에 dll 부분이 있어야합니다. dll 부분은 사용자 정의 속성을 선언합니다. 그렇지 않으면 유형 스펙을 전달하거나 사용자 정의 속성에 대한 config 섹션을 설정하는 것이 좋습니다. 사용 및 구성하고 다시 codegen 프로그램은 정확히 무엇이 돌아가는지 알고 있습니다.

희망이 도움이됩니다.

P

+0

신난다, 어셈블리를 걷기 위해 LINQ to Entities를 사용 했습니까? – RobS

+0

아니요 Assembly.Load (...) 및 System.Reflection의 형식을 사용했습니다. –

0

P,

I 사용한 반사 반성 (FxCop SDK) 및 CodeModel (Visual Studio Automation)는 similar problem를 해결한다. 한 API에서 다음 순서로이 순서대로 갔고 CodeModel이 가장 좋습니다. 리플렉션의 문제점은 AppDomain이로드되는 동안 어셈블리를 메모리에 잠그는 것입니다. 이것은 독립 실행 형 실행 파일이 없어도 T4의 문제입니다. T4를 사용하면 메타 데이터에서 코드를 생성 한 후 원본 어셈블리를 다시 컴파일 할 수 없습니다. 내성 검사가 잘 작동하고 어셈블리를 잠그지 않았지만 여전히 문서화되지 않았으며 메타 데이터를 사용하기 전에 어셈블리를 컴파일해야합니다. CodeModel은 모두 문서화되어 있으며 C# 소스 코드에서 메타 데이터에 직접 액세스 할 수 있습니다. 이 도움이

희망, 올렉

+0

감사합니다. 올렉 :이 문제는 아마 없었으며 console.app 시나리오에서 기대하지 않았습니다. T4에 대한 귀하의 의견은 흥미 롭습니다. ASP.NET MVC 사람들이 t4로 어떻게하는지 궁금합니다. 그런데 대상 유형을 로컬로 복사하면이 잠금 문제가 계속 유지 될 것이라고 생각합니까? –