Entity Framework 7에서 datetime을 삽입하지 못했습니다.

debian entity-framework-core mono sql-server windows

문제

나는 EntityFramework 7, beta7을 사용하고 있으며 다음 엔티티를 가지고있다.

기음#

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

SQL

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

그리고 저는 다음을 실행합니다 :

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

이것은 Windows에서는 성공적이지만 debian에서는 mono에서 실패합니다. 같은 SQL 서버 / 데이터베이스. 생성 된 SQL은 다음과 같습니다. @p1 렌더링 된 유형과 값의 차이점에 유의하십시오.

Windows

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

리눅스

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

Linux에서의 오류는 다음과 같습니다.

문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환이 실패했습니다.

질문들

  1. 유형이 datetime 으로 명시 적으로 설정되어있는 경우 Windows에서 datetime2 생성하는 이유는 무엇입니까?
  2. 리눅스 버전은 무효 SQL을 생성하므로 실패합니다. 어떻게 모노 / 리눅스에 datetime 값을 삽입 할 수 있습니까?

수락 된 답변

  1. .NET DateTime 유형은 SQL Server의 "datetime"유형보다 넓은 범위를가집니다. 사실, .NET DateTime은 SQL Server의 "datetime2"유형과 동일한 범위를 가지므로 Entity Framework는 DateTime을 SQL 날짜로 변환 할 때 (가능한 경우) 모든 경우에 datetime2를 사용합니다 (예제에서와 같이). 이 경우 테이블 열의 유형은 중요하지 않습니다. EF 팀이 datetime 및 datetime2와 관련된 문제점을 논의하고이를 그대로두기로 결정한이 디자인 회의 노트를 읽을 수 있습니다 (그 배경과 그 이유).

  2. Mono는 TDS를 사용하여 SQL Server ( FreeTDS 기반)를 사용하며 오래된 버전을 사용합니다.이 버전에서는 SQL Server의 "datetime2"유형에 대해 알지 못하므로 새로운 버전의 TDS로 업그레이드하는 대신 (아마도 너무 많습니다. 지금 일하는) 일종의 해킹이 구현되어 datetime2가 \에서 string으로 변환되었습니다. datetime2는 datetime보다 정밀도가 높기 때문에 datetime2를 string으로 변환 한 다음이 문자열을 datetime (암시 적으로 완료 됨)으로 변환하면 오류가 발생합니다. 확인할 수 있습니다.

    select cast('2015-09-28T23:03:21.5561720' as datetime2) -- < all fine
    select cast('2015-09-28T23:03:21.5561720' as datetime) -- < error from your question
    

    여기 에 대한 자세한 내용은 여기를 참조하십시오 .

모노에서 SQL 서버와 함께 EF를 사용할 수 있는지 물어볼 수 있습니다. EF 모델에서 ProviderManifestToken을 2005로 설정하여 문제를 해결할 수 있습니다. 이렇게하면 SQL Server 2005에서 작동하는 EF가 만들어지며 어디에서나 datetime2가 사용되지 않습니다. 그러나 SQL Server 2005 이후에 추가 된 다른 유형은 분명 더티 해킹이라고 말할 수 있습니다.

보조 노트로서 SQL 서버와 함께 mono에 대한 진지한 개발을하지 않는 것이 좋습니다. 모노의 SQL Server 공급자는 버그로 가득차 있으며 위의 버그는 가장 결백 한 것 중 하나입니다. null 값, 연결 풀 문제 (연결 풀 연결 시간이 초과되면이 연결이 전체 수명 동안 중단되고 해당 연결의 모든 쿼리가 실패합니다.) 해킹 - 연결에서 연결 제거 당신의 질의가 시간 초과 된 경우 풀) 등이 있습니다.이 버그의 대부분은 수개월 동안 알려져 있지만 아직 고쳐지지 않았습니다. 만약 당신이 선택의 여지가 - 단지 postgresql을 사용하여, 그것은 무료, 좋은, 그리고 모노에 아무런 문제가 없었다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.