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

내 HomeController에 다음 코드가 있습니다.

public ActionResult Edit(int id)
{
    var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
    return View(ArticleToEdit);
}

[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
    var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
    if (!ModelState.IsValid)
        return View(originalArticle);

    _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
    _db.SaveChanges();
    return RedirectToAction("Index");
}

그리고 이것은 Edit 메소드의 뷰입니다 :

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="headline">Headline</label>
            <%= Html.TextBox("headline") %>
        </p>
        <p>
            <label for="story">Story <span>( HTML Allowed )</span></label>
            <%= Html.TextArea("story") %>
        </p>
        <p>
            <label for="image">Image URL</label>
            <%= Html.TextBox("image") %>
        </p>
        <p>
            <input type="submit" value="Post" />
        </p>
    </fieldset>

<% } %>

제출 버튼을 누르면 오류가 발생합니다. {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}문제가 무엇인지 아십니까? 편집 방법이 DB에 게시 된 값을 편집 된 것으로 업데이트하려고한다고 가정하지만 어떤 이유로 든 좋아하지는 않습니다 … 나는 날짜에 언급되지 않은 날짜가 왜 관련되어 있는지 알지 못하지만 편집 컨트롤러 방법?



답변

문제는 ApplyPropertyChanges양식 (헤드 라인, 스토리 및 이미지)의 데이터로만 채워진 모델 객체와 함께 사용한다는 것 입니다. ApplyPropertyChanges초기화되지 않은을 포함하여 개체의 모든 속성에 변경 사항을 적용합니다.이 속성 DateTime은 SQL Server의 범위를 벗어난 0001-01-01로 설정되어 DATETIME있습니다.

을 사용하는 대신 ApplyPropertyChanges수정중인 객체를 검색하고 양식을 편집하는 특정 필드를 변경 한 다음 수정 사항으로 객체를 저장하는 것이 좋습니다. 이렇게하면 변경된 필드 만 수정됩니다. 다른 방법으로 채워진 다른 필드를 사용하여 페이지에 숨겨진 입력을 넣을 수는 있지만 동시 편집에는 적합하지 않습니다.

최신 정보:

다음은 객체의 일부 필드를 업데이트 한 테스트되지 않은 샘플입니다 (LINQ to SQL을 사용한다고 가정합니다).

var story = _db.ArticleSet.First(a => a.storyId == ArticleToEdit.storyId);
story.headline = ArticleToEdit.headline;
story.story = ArticleToEdit.story;
story.image = ArticleToEdit.image;
story.modifiedDate = DateTime.Now;
_db.SubmitChanges();


답변

이것은 Entity Framework를 사용할 때 사람들이 겪는 일반적인 오류입니다. 이는 저장중인 테이블과 연관된 엔티티에 필수 날짜 시간 필드가 있고 일부 값으로 설정하지 않은 경우 발생합니다.

기본 날짜 / 시간 객체는 값으로 만들어지며 01/01/1000null 대신 사용됩니다. 이것은 날짜 값 열을 보낼 수있는 날짜 시간 열로 전송됩니다.1753-01-01 00:00:00 이후 범위를 벗어난 예외가 발생합니다.

이 오류는 null을 허용하도록 데이터베이스 필드를 수정하거나 값으로 필드를 초기화하여 해결할 수 있습니다.


답변

DATETIME1753/1/1부터 “영원”까지 (9999/12/31),
DATETIME20001/1/1부터 영원까지 지원합니다.

MSDN

답 :DateTime ‘0001/1/1’값
으로 저장하려고한다고 가정합니다 . 그것은, 만약 그렇다면 다음 대체 그냥 브레이크 포인트 설정 및 디버그 DateTime으로 null또는 세트 정상 날짜입니다.


답변

이것은 나를 미치게했다. nullable 날짜 시간 ( DateTime?)을 사용하지 않으려 고했습니다 . SQL 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;
                    }
                }
            }
        }
    }
}


답변

모델에 추가하여이 문제를 해결할 수도 있습니다 (Entity Framework 버전> = 5).

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreationDate { get; set; }


답변

날짜 시간이고 열을 허용하는 열이 있으면이 오류가 발생합니다. .SaveChanges (); 전에 객체에 전달할 값을 설정하는 것이 좋습니다.


답변

다음과 같이 모델을 변경 한 후 (코드 우선)이 오류가 발생했습니다.

public DateTime? DateCreated

public DateTime DateCreated

DateCreated에 널값이있는 행이 있으면이 오류가 발생했습니다. 따라서 표준 값으로 필드를 초기화 하려면 SQL UPDATE 문을 수동으로 사용해야했습니다 .

다른 해결책은 제출 된 기본값을 지정하는 것일 수 있습니다.