2016-10-06 4 views
3

내 EF POCO에서 typescript 인터페이스를 생성하려면 this 답안에서 제안 된 것에서 약간 수정 된 T4 템플릿을 사용하고 있습니다.Entity Framework 클래스에서 기본 sql 값 가져 오기

먼저 EF Core POCO가 데이터베이스에서 생성되고 일부 데이터베이스 열에는 기본값이 있습니다. 이것들은 EF 생성기에 의해 내 컨텍스트에 정확하게 매핑됩니다. .HasDefaultValueSql("0");

주어진 EF 클래스의 기본값에 액세스하는 방법에 대해 약간 혼란 스럽습니다. GetValueOrDefault은 트릭을 수행 할 수 있다고 생각했지만 그게 .net 유형의 기본값을 제공하는 것 같습니다.

거기에 몇 가지 다른 솔루션이 작업을 받고 있지만 거기에 ASP .Net 코어 아직 작동하는 찾을 수없는 것을 참조하십시오.

이상적으로, T4 템플릿의 다음 줄에서 속성 설명을 생성하기 때문에 속성을 기본 EF 값으로 설정하는 것이 가장 좋습니다. TypeScript def의 기본값. 경우

foreach (MemberInfo mi in GetInterfaceMembers(t)) 
{ 
    sb.AppendFormat(" {0}: {1};\n", mi.Name, GetTypeName(mi)); 
} 
+0

이 훨씬 쉬울 것 대신. '[DefaultValue ("0")]'와 같은 것. 그런 다음 'MemberInfo.CustomAttributes'를 사용하여 쉽게 액세스 할 수 있습니다. – haim770

+0

템플릿의 소스'DbContext '에 대한 액세스 권한이 있습니까? –

+0

@ haim770 이미 존재하는 데이터베이스에서 클래스를 생성 중입니다. db를 소유하고 있지 않습니다. 변경하면 수동으로 기본값을 검사하지 않고 다시 생성 할 수 있습니다. –

답변

2

당신이 생성 DbContext에 액세스 할 수 대신 반사 DbContext.Model에 의해 제공되는 메타 데이터를 사용할 수 있습니다. 예를 들어

:

foreach (var type in db.Model.GetEntityTypes()) 
{ 
    foreach (var property in type.GetProperties()) 
    { 
     var defaultValue = property.Relational().DefaultValue; 
    } 
} 

IModel.FindEntityType 같은 유용한 방법이 많이도 있습니다 IEnityType.FindProperty

당신이 데이터 주석 속성을 사용하여 기본 값을 설정합니다 경우
+0

T4 템플릿에서 RelationalMetadataExtensions에서 확장 메서드를 참조하려면 얻으려면 고민 해요,이 코드는 작동합니다 클래스에서는 괜찮지 만 'IProperty'에는 텍스트 템플릿의 'Relational'오류에 대한 정의가 포함되어 있지 않습니다. 어떤 아이디어? –

+1

아, 나는 어셈블리 dll을 참조해야하고, 네임 스페이스도 역시 참조해야한다. –

+0

참으로. Assemby :'Microsoft.EntityFrameworkCore.Relational', 네임 스페이스 :'Microsoft.EntityFrameworkCore' –

관련 문제