내 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/1000
null 대신 사용됩니다. 이것은 날짜 값 열을 보낼 수있는 날짜 시간 열로 전송됩니다.1753-01-01 00:00:00
이후 범위를 벗어난 예외가 발생합니다.
이 오류는 null을 허용하도록 데이터베이스 필드를 수정하거나 값으로 필드를 초기화하여 해결할 수 있습니다.
답변
DATETIME
1753/1/1부터 “영원”까지 (9999/12/31),
DATETIME2
0001/1/1부터 영원까지 지원합니다.
답 :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 문을 수동으로 사용해야했습니다 .
다른 해결책은 제출 된 기본값을 지정하는 것일 수 있습니다.