2009-12-25 8 views
0

asp.net mvc와 함께 Entity Framework를 사용하고 있지만 MVC가 큰 역할을하지는 않습니다.Entity Framework에서 * 조회 * 테이블에 SqlDate 예외를 throw합니다.

고객 및 조회 테이블이 있습니다 (몇 가지가 있으며 모두 동일한 방식으로 작동하므로 간단히 지역을 선택합니다). Customer와 Territory에는 LastUpdated 필드가 있습니다 (코드에서 수동으로 설정되는 Datetime). 나는 지역을 하드 코딩하고,보기에서만 고객 데이터를 얻을 경우

, 나는 어떤 문제가 발생하지 않습니다

public ActionResult CreateCustomer([Bind(Exclude = "CustId")] Customer cm) { 
    cm.Territory = (from t in repo.Territory where t.ID == 2 select t).First(); 
    repo.AddToCustomer(cm); 
    repo.SaveChanges(); 
} 

내가 말했듯이, 아무런 문제. 그러나 일치하는 ID (Territory.ID)와 함께보기에서 드롭 다운을 사용하면 문제가 발생합니다. 보기에

ViewData["territory"] = new SelectList(repo.Territory, "ID", "Name", 1); 

및 해당 라인 :

Territory: <%= Html.DropDownList("Territory.ID", (IEnumerable<SelectListItem>)ViewData["territory"])%> 

내가 좋은 소식과 나쁜 소식을 얻을 : 나는 다음과 같은 컨트롤러의 라인을 가지고 좋은 소식은 내가 잘에 할당 된 영역의 ID를 얻을 수 있다는 것입니다 Customer 객체의 해당 멤버. 나쁜 소식은 Territory.LastUpdated 값이 1/01/0001로 설정되어 있다는 것입니다. 분명히 I은이 값을 신경 쓰지 않지만 EF 관리처럼 보입니다. -하지만 결론 EF가 데이터베이스에서 값을 검색 한 다음 EF 값 ... 아니면 뭔가 다른과 비교하려고처럼

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM

가 보이는 : 나는 다음과 같은 오류를 얻고있다 SaveChanges를 호출 할 때 내가 그렇게 똑똑하지 못하도록하는 방법을 알아낼 수는없는 것입니다.

int terID = Int32.Parse(formData["terID"]); 
cm.Territory = (from d in repo.Territory 
    where d.ID == terID select d).First(); 

이 작동 (내 분석 나를 편안하게) :

지금, 나는 드롭 ID 뭔가 다른 (대신 "Territory.ID"의 "terID") 및 사용 FormCollection를 할 이름 하지만 이것이 최선의 방법은 아닙니다. 가 나는 또한 아무도 같은 문제에 부딪쳤다 없다는 것을 믿을 수 없다 -하지만 난 아무것도 관련을 찾을 수 없습니다 ... 내가 찾을 수있는 최선 link text이지만 내가 잘라하려고 많은 세부 사항

없이 힌트의 더 코드와 관련이없는 모든 것 - 일부 오타가있는 경우 게시물에 있습니다. 반드시 코드 자체는 아닙니다! 감사합니다.

답변

0

직접 외래 키 매핑이 좋지 않은 EF 1.0을 사용하고 있다고 가정합니다.

보기에서 실행으로 게시 된 지역은 Datacontext에 바인딩되지 않으므로 고객 개체를 저장할 때 EF는 연결된 지역 개체도 저장합니다.

먼저 Territory 개체를 db에서 가져 와서 고객에게 할당해야합니다.

귀하의 솔루션은 완벽하게 괜찮습니다. 왜냐하면 EF 1.0에는 다른 것이 없기 때문입니다. - :

1

EF가 전체 행을 저장하므로/예외가 발생하는 경우 Territory.LastUpdated가 기본값으로 설정됩니다.

이 문제를 해결하는 가장 쉬운 방법은 저장하기 전에 DateTime.Now로 설정하는 것입니다.

관련 문제