태그 보관물: entity-framework

entity-framework

datetime2 데이터 유형을 datetime 데이터 유형으로 변환하면 범위를 벗어난 값 오류가 반환됩니다. datetime2 데이터

5 개의 열이있는 데이터 테이블이 있는데 행은 데이터로 채워지고 트랜잭션을 통해 데이터베이스에 저장됩니다.

저장하는 동안 오류가 반환됩니다.

datetime2 데이터 유형을 datetime 데이터 유형으로 변환하면 범위를 벗어난 값이 발생했습니다.

내 데이터 테이블에는 유형이 DateTime2있고 내 데이터베이스에는 DateTime; 그건 잘못이야

날짜 열은 다음 DateTime과 같이 설정됩니다 .

new DataColumn("myDate", Type.GetType("System.DateTime"))

질문

이것을 코드로 해결할 수 있습니까? 아니면 데이터베이스 수준에서 무언가를 변경해야합니까?



답변

칼럼에 어떤 종류의 날짜가 있습니까?

그것들 모두 유형의 범위에 맞습니까?


제쳐두고, 생성자 를 위해 Type객체 를 얻는 올바른 방법 DataColumntypeof키워드입니다.

따라서 열을 만들려면 다음을 작성해야합니다.

new DataColumn("myDate", typeof(DateTime))

답변

필드가 NULL 값을 허용하지 않을 때 DateTime 필드에 값을 지정하지 않으면 이런 일이 발생할 수 있습니다 .

그것은 나를 위해 그것을 고쳤다!


답변

DATETIME및 .NET에서 모두 DATETIME2매핑 System.DateTime-실제로는 .NET 유형과 동일하므로 실제로 “변환”을 수행 할 수 없습니다.

MSDN 문서 페이지를 참조하십시오. http://msdn.microsoft.com/en-us/library/bb675168.aspx

이 두 가지에 대해 ” SqlDbType” 에는 두 가지 값 이 있습니다. DataColumn정의 에서 값을 지정할 수 있습니까?

그러나 SQL Server에서 지원되는 날짜 범위는 상당히 다릅니다.

DATETIME1753/1/1 ~ “영원”(9999/12/31)을 DATETIME2지원하고 0001/1/1 ~ 영원 을 지원합니다.

따라서 실제로해야 할 일은 날짜의 연도를 확인하는 것입니다 .1753 이전 인 경우 DATETIMESQL Server 의 열이 처리 할 수 ​​있도록 1753 이후로 변경해야 합니다.

마크


답변

내 SQL Server 2008 데이터베이스에서 DateTime열을 nullable로 표시하지 않지만 GetDate()함수를 기본값으로 표시했습니다. EF4를 사용하여 새 객체를 삽입 할 때 객체에 DateTime 속성을 명시 적으로 전달하지 않았기 때문에이 오류가 발생했습니다. SQL 함수가 날짜를 처리 할 것으로 예상했지만 그렇지 않았습니다. 내 솔루션은 데이터베이스에 의존하지 않고 코드에서 날짜 값을 보내서 생성하는 것이 었습니다.

obj.DateProperty = DateTime.now; // C#

답변

나를 위해 날짜 시간이 되었기 때문에 ..

01/01/0001 00:00:00

이 경우에는 FirstYearRegistered 코드를 예로 사용하여 EF DateTime Object에 null을 할당하려고합니다.

DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
    vehicleData.DateFirstReg = FirstYearRegistered;
}  

답변

이것은 나를 미치게했다. nullable 날짜 시간 ( DateTime?)을 사용하지 않으려 고했습니다 . SQL Server 2008 datetime2유형 을 사용할 수있는 옵션이 없었습니다.

modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");

나는 결국 다음을 선택했다.

public class MyDb : DbContext
{
    public override int SaveChanges()
    {
        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

답변

때때로 EF는 이것이 계산 된 열 이나 트리거를 처리하는지 알지 못합니다 . 의도적으로 이러한 작업은 삽입 후 EF 외부의 값을 설정합니다.

수정은 속성 에서 해당 열의 ComputedEF 로 지정하는 것 입니다 .edmxStoreGeneratedPattern

나를 위해 열에 현재 날짜와 시간을 삽입 한 트리거가 있었을 때였습니다. 세 번째 섹션의 아래를 참조하십시오.


해결 단계

Visual Studio에서 Model Browser페이지를 연 Model다음 Entity Types->

  1. 엔티티 및 날짜 시간 특성을 선택하십시오.
  2. 고르다 StoreGeneratedPattern
  3. 로 설정 Computed


이 상황에서 다른 답변은 해결 방법입니다. 열의 목적 상 레코드를 만들 때 지정된 시간 / 날짜를 지정하는 것입니다. 이는 올바른 시간을 추가하기 위해 트리거를 실행하는 SQL의 작업입니다. 이 SQL 트리거와 같은 :

DEFAULT (GETDATE()) FOR [DateCreated].