2012-09-25 3 views
1

C#의 MVC 3 응용 프로그램에서 테이블의 항목을 업데이트하는 데 문제가 있습니다.엔티티 프레임 워크가 잘못된 문을 보내서 업데이트 됨

EF에서 호출되는 업데이트 문자열은 (문이 명확성을 위해 제거 된 다른 모든 값) 등 같은 날짜에 보내는 :

where [CreateDate] = '2012-09-24 19:12:08' 

실제 데이터베이스 항목이있다 date이고 SQL 데이터 형식은 datetime2 (7)입니다.

2012-09-24 19:12:08.6457698 

코드가 실행될 때 날짜가 일치하지 않고 업데이트되지 않습니다. 기존 데이터베이스에서 Reverse Engineering Code First를 사용하여 모델을 만들었습니다.

public class NPost 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int NPostID { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public System.Guid UserId { get; set; } 

    [Required(ErrorMessage = "Please enter a title!")] 
    [StringLength(Int32.MaxValue)] 
    public string Title { get; set; } 

    [AllowHtml] 
    [Required(ErrorMessage = "Please enter the body of the post!")] 
    [StringLength(Int32.MaxValue)] 
    public string Body { get; set; } 

    [Required(ErrorMessage = "Please enter at least one tag!")] 
    [StringLength(Int32.MaxValue)] 
    public string Tags { get; set; } 

    public System.DateTime CreateDate { get; set; } 
    public Nullable<System.DateTime> PublishDate { get; set; } 
    public Nullable<double> Rating { get; set; } 

    [Required(ErrorMessage = "Please enter a topic!")] 
    [StringLength(Int32.MaxValue)] 
    public string Topic { get; set; } 

    [StringLength(Int32.MaxValue)] 
    public string TitleImage { get; set; } 

    [StringLength(Int32.MaxValue)] 
    public string ListingImage { get; set; } 

    [StringLength(Int32.MaxValue)] 
    public string BoxImage { get; set; } 

    public virtual aspnet_Users aspnet_Users { get; set; } 
} 

내가이 날짜가 줄을 올바르게 작동하도록하려면 어떻게해야합니까 : 여기 내 모델은?

+4

왜이 값을 타임 스탬프와 비교합니까? 동일한 초에 두 개의 행이 삽입되면 어떻게 될까요? –

+0

타임 스탬프가 고유 식별자가 아닙니다. 방금 다른 모든 진술을 삭제했습니다. –

+0

EF에서 사용하는 날짜는 어디입니까? – BNL

답변

1

여기에 나와있는 것에 대해 다른 사람들이 표현한주의 사항에 동의합니다. 그러나 우리는 귀하의 질문에 대한 직접적인 대답을해야합니다! 나는 EF가 새로운 datetime2 타입보다 SQL datetime 값으로 당신의 컬럼을 다루고 있다고 의심한다. 그래서 다음을 시도하십시오.

속성에 [Column(TypeName = "datetime2")] 속성을 사용하여 정확한 데이터베이스 유형을 나타내거나 유동적 인 구성을 선호하는 경우 HasColumnType 메쏘드를 사용할 수 있습니다.

0

날짜와 정확히 일치하는 것은 오류가 발생하는 것 같습니다. Entity Framework는 일반적으로 기본 키를 기반으로 업데이트를 수행해야합니다. 여기서 NPostId = 50입니다. 컨트롤러의 업데이트를 ID를 기반으로 변경할 수 있습니까?

var postById = context.Posts.Where(p => p.NPostId == id).First(); 
postById.Text = text; 
... 
context.Entry(postById).State = EntityState.Modified; 
postById.SaveChanges(); 
+0

업데이트의 기반을 지정하는 방법은 무엇입니까? –

+0

누군가가 목록에서 게시물을 선택하면 ID가 컨트롤러에 전달되었는지 확인하십시오. 이는 정상적인 규칙입니다. 그런 다음 ID로 게시물 엔티티를 가져 와서이를 기반으로 업데이트를 수행 할 수 있습니다. 게시물을 예제로 업데이트합니다. – Turnkey

+0

코드에 의해 수행 된 매핑이 테이블의 모든 열을 사용하는 키를 처음 만들 때 고유 식별자 문제가 발생했습니다. 이 문제를 해결하면 문제가 해결됩니다. –

-1

고유 식별자로 타임 스탬프를 사용하는 경우 두 항목이 동일한 시간 값을 가질 수 없음을 보장해야합니다. 그게 정말로 원하는 경우 CreateDate 테이블 열의 정밀도를 datetime2 (0)로 설정하고 열에 고유 키를 설정하십시오. 고유 식별자로 타임 스탬프를 사용하여 그러나이

... 아론의 점에

는 아마 좋은 생각이 아니다. 자동 증가 필드 또는 uniqueidentifier (GUID 유형) 필드를 대신 사용하십시오.

+0

다른 의견을 참조하십시오. 날짜는 고유 한 식별자가 아닙니다. –

관련 문제