2017-04-18 5 views
0

코드 첫 번째 엔터티 프레임 워크를 통해 함수를 실행하는 동안 열 이름을 소문자로 사용해야합니다. 내가 this link에서 솔루션을 사용하려고했지만 그것은 단지 테이블 매핑 및 함수 매핑을 위해 작동합니다.Entity Framework에서 생성 된 쿼리의 하위 케이싱

이것은 함수의 실행에서 데이터를 보유하는 내 POCO입니다. fnrbreportinfo 함수 이름이고 @reportId 함수 파라미터이다

public class RBReportInfo 
{ 
    [Key] 
    public int ReportId { get; set; } 
    public int ReportDataViewId { get; set; } 
} 

는 EF 의해 생성되는 코드이다.

SELECT 
[Extent1].[ReportId] AS [ReportId], 
[Extent1].[ReportDataViewId] AS [ReportDataViewId] 
FROM [dbo].[fnrbreportinfo](@reportId) AS [Extent1] 

아래 코드는 POCO를 채우기 위해 실행됩니다.

var idParameter = new ObjectParameter("reportId", reportId); 
return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<RBReportInfo>(
      $"[{nameof(ReportBuilderContext)}].[fnrbreportinfo](@reportId)", idParameter); 

이 코드는 쿼리에서 소문자 데이터베이스 열 이름과 일치하는 속성의 경우를 변경하는 OnModelCreating() 방식으로 구현된다.

 modelBuilder.Properties().Configure(c => 
     { 
      var name = c.ClrPropertyInfo.Name.ToLower(); 
      c.HasColumnName(name); 
     }); 

따라서 EF에서 생성 된 쿼리는 열 이름이 소문자 인 곳에서 아래와 같아야합니다.

SELECT 
[Extent1].[reportid] AS [ReportId], 
[Extent1].[reportdataviewid] AS [ReportDataViewId] 
FROM [dbo].[fnrbreportinfo](@reportId) AS [Extent1] 

나는 소문자하기 위해 노력하고 속성 이름을 변경 시도했지만 그것은 C#에서 속성 이름에 대한 PascalCase 규칙을 나누기.

public class RBReportInfo 
{ 
    [Key] 
    public int reportid { get; set; } 
    public int reportdataviewid { get; set; } 
} 

나는 또한 속성을 사용하여 시도했지만 역시 실패했습니다.

[Column("reportid")] 
public int ReportId{get;set;} 

모든 테이블/기능이 소문자가되므로 대소 문자를 구분하는 데이터베이스가 필요합니다.

+1

"요구 사항은 대소 문자를 구분하는 데이터베이스로 인해 모든 테이블/기능이 소문자로되어 있기 때문입니다." SQL Server를 사용하지 않을 것을 제안합니다. 사용중인 데이터베이스 엔진 및 Entity Framework 공급자를 명시하십시오. 그것은 EF 공급자 (비 - 마이크로 소프트)처럼 버그가 있습니다. – Aron

답변

0
내가 이것을 해본 적이

하지만 귀하의 경우와 나는 유망 보인다 바깥 쪽에서 우연히 단풍 나무가 지금 막 자랍니다.

class EFCommandInterceptor: IDbCommandInterceptor 
{ 
    public void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     LogInfo("NonQueryExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText)); 
    } 

    public void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     LogInfo("NonQueryExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText)); 
    } 

    public void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContextt<System.Data.Common.DbDataReader> interceptionContext) 
    { 
     LogInfo("ReaderExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText)); 
    } 

    public void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext) 
    { 
     LogInfo("ReaderExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText)); 
    } 

    public void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext) 
    { 
     LogInfo("ScalarExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText)); 
    } 

    public void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext) 
    { 
     LogInfo("ScalarExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText)); 
    } 

    private void LogInfo(string command, string commandText) 
    { 
     Console.WriteLine("Intercepted on: {0} :- {1} ", command, commandText); 
    } 
} 

당신은 here 자세한 내용을보실 수 있습니다 : 쿼리를 차단하고 아마도 command.CommandTextToLower()를 호출 할 수 있도록 EF는 차단을 할 수 있습니다.

0

연인 사건 명명 속성 대신 속성 이름을 설정하지 않는 이유는 무엇입니까?

[Table("mytable")] 
public class MyTable { 

    [Column("firstcolumn")] 
    public int firstColumn {get;set} 

    [Column("secondcolumn")] 
    public string secondColumn {get;set;} 

} 

그것은 해결책이 아니다, 그러나 당신이 좋아하는 사용자 정의 메소드를 추가 할 수있는이

public IQueriable<TResult> SelectFromDB<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) 
{ 
     return source.SqlQuery(source.Select(selector).ToString().ToLower()); 
} 

그리고

using(var context = new DBContext()) 
{ 
    context.SomeTable.SelectFromDB(data => data).ToList(); 
} 
+0

그 중 하나도 작동하지 않았다는 것을 잊어 버렸습니다. –