2009-03-14 2 views
5

NHibernate를 백엔드로 사용하는 ASP.NET MVC 프로젝트에서 일부 SQL Server 데이터베이스 테이블에 다시 쓰는 데 문제가 있습니다.NHibernate가 지속되지 않음 DateTime SqlDateTime 오버 플로우

이 날짜 필드에는 nullable이 없으므로 nullable datetime을 설정하는 방법에 대한 많은 대답이 도움이되지 못했습니다.

기본적으로 DateAdded 및 LastUpdated 필드가있는 엔터티를 저장하려고하면 SqlDateTime 오버플로 예외가 발생합니다. 과거에 datetime 필드를 smalldatetime 열에 쓰려고했던 것과 비슷한 문제가있었습니다. 열의 유형을 업데이트하면 문제를 해결 한 것처럼 보였습니다. 내 직감은 테이블 정의 또는 호환되지 않는 데이터 형식의 일부 문제가 될 것이고 오버플로 예외는 다소 엉성한 것입니다.

나는 NHibernate가 실행하려고하는 테이블 정의와 쿼리의 예제를 첨부했다. 어떤 도움이나 제안도 크게 감사 할 것이다. 응답에서

CREATE TABLE [dbo].[CustomPages](
    [ID] [uniqueidentifier] NOT NULL, 
    [StoreID] [uniqueidentifier] NOT NULL, 
    [DateAdded] [datetime] NOT NULL, 
    [AddedByID] [uniqueidentifier] NOT NULL, 
    [LastUpdated] [datetime] NOT NULL, 
    [LastUpdatedByID] [uniqueidentifier] NOT NULL, 
    [Title] [nvarchar](150) NOT NULL, 
    [Term] [nvarchar](150) NOT NULL, 
    [Content] [ntext] NULL 
) 

exec sp_executesql N'INSERT INTO CustomPages (Title, Term, Content, LastUpdated, DateAdded, StoreID, LastUpdatedById, AddedById, ID) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)',N'@p0 
nvarchar(21),@p1 nvarchar(21),@p2 nvarchar(33),@p3 datetime,@p4 datetime,@p5 uniqueidentifier,@p6 uniqueidentifier,@p7 uniqueidentifier,@p8 uniqueidentifier',@p0=N'Size and Colour 
Chart',@p1=N'size-and-colour-chart',@p2=N'This is the size and colour chart',@p3=''2009-03-14 14:29:37:000'',@p4=''2009-03-14 
14:29:37:000'',@p5='48315F9F-0E00-4654-A2C0-62FB466E529D',@p6='1480221A-605A-4D72-B0E5-E1FE72C5D43C',@p7='1480221A-605A-4D72-B0E5-E1FE72C5D43C',@p8='1E421F9E-9A00-49CF-9180-DCD22FCE7F55' 

하여 답변/의견, 나는 유창함 자 NHibernate를 사용하고 왜 @ P3와 @의 P4가 2 배 작은 따옴표를해야합니까 생성 된 매핑은

public CustomPageMap() { 

      WithTable("CustomPages"); 

      Id(x => x.ID, "ID") 
       .WithUnsavedValue(Guid.Empty) 
      . GeneratedBy.Guid(); 

      References(x => x.Store, "StoreID"); 

      Map(x => x.DateAdded, "DateAdded"); 
      References(x => x.AddedBy, "AddedById"); 
      Map(x => x.LastUpdated, "LastUpdated"); 
      References(x => x.LastUpdatedBy, "LastUpdatedById"); 


      Map(x => x.Title, "Title"); 
      Map(x => x.Term, "Term"); 
      Map(x => x.Content, "Content"); 

     } 

    <?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="MyNamespace.Core" namespace="MyNamespace.Core"> 
<class name="CustomPage" table="CustomPages" xmlns="urn:nhibernate-mapping-2.2"> 
<id name="ID" column="ID" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"><generator class="guid" /></id> 
<property name="Title" column="Title" length="100" type="String"><column name="Title" /></property> 
<property name="Term" column="Term" length="100" type="String"><column name="Term" /></property> 
<property name="Content" column="Content" length="100" type="String"><column name="Content" /></property> 
<property name="LastUpdated" column="LastUpdated" type="DateTime"><column name="LastUpdated" /></property> 
<property name="DateAdded" column="DateAdded" type="DateTime"><column name="DateAdded" /></property> 
<many-to-one name="Store" column="StoreID" /><many-to-one name="LastUpdatedBy" column="LastUpdatedById" /> 
<many-to-one name="AddedBy" column="AddedById" /></class></hibernate-mapping> 
+0

테이블과 SQL은 괜찮아 보입니다. SQL 쿼리를 수동으로 실행하려고하면 SQL 쿼리가 작동합니까? 코드와 최대 절전 모드 매핑 파일을 게시하는 데 유용 할 수도 있습니다. –

+0

예, datetimes (utc 스타일 문자열로) 주위에 이중 작은 따옴표를 작은 따옴표로 변경해야한다는 점을 제외하면 쿼리가 SQL 쿼리 분석기에서 올바르게 실행됩니다. Nhibernate에 의해 생성 된 –

답변

0

이하? 복사하여 붙여 넣기 오류가 있습니까?

나는 (SQL 여기에 설치하지 않은)를 확인 할 수 없지만 millisecond separator는 "점", 즉, 안 "2009-03-14 14 : 29 : 37.000"

@ (P3) "전에", @의 P4 여기에 "후"입니다 :

exec sp_executesql 
    N'INSERT INTO CustomPages (Title, Term, Content, LastUpdated, DateAdded, StoreID, LastUpdatedById, AddedById, ID) 
    VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)', 
    N'@p0 nvarchar(21),@p1 nvarchar(21),@p2 nvarchar(33),@p3 datetime,@p4 datetime,@p5 uniqueidentifier,@p6 uniqueidentifier,@p7 uniqueidentifier,@p8 uniqueidentifier', 

    @p0=N'Size and Colour Chart', 
    @p1=N'size-and-colour-chart', 
    @p2=N'This is the size and colour chart', 
    @p3=''2009-03-14 14:29:37:000'', --quotes + dot wrong? 
    @p4='2009-03-14 14:29:37.000', --quotes + dot correct? 
    @p5='48315F9F-0E00-4654-A2C0-62FB466E529D', 
    @p6='1480221A-605A-4D72-B0E5-E1FE72C5D43C', 
    @p7='1480221A-605A-4D72-B0E5-E1FE72C5D43C', 
    @p8='1E421F9E-9A00-49CF-9180-DCD22FCE7F55' 
+0

그래, 나는 날짜를 렌더링하는 방법이 약간 이상하다고 생각했다. 그러나 작은 따옴표에 대해 큰 따옴표를 교체해야한다는 것을 제외하면 쿼리 분석기에서 작동한다. 나는 방언을 수정하는 방법을 nhibernate에게 알릴 수 있다고 생각하는 nhibernate 의사의 5 장을 조사했지만 가능하다. –

+0

SQL 서버에 대한 2009-03-14 14 : 29 : 37 : 000 형식이 잘못됨 – gbn

+0

방언이 잘못되었을 수있다. 너의 문제 야. 왜 그것을 설정하는 것이 불가능하다고 말하는가? SessionFactory는 어떻게 작성하고 있습니까? 설정 파일에서 읽거나 프로그래밍 방식으로 생성하고 있습니까? –

0

내 SQL 2005 설치에 잘 실행하여 문제의 SQL 스크립트 (한 번 난 인용 문제 GBN에 의해 ​​포착 고정). 매핑도 괜찮아 보입니다. 작은 도움이되어서 죄송합니다.

0

이 매핑을 만들기 위해 s # architecture/fluentnhibernate를 사용하고 있었지만, 최신 버전으로 업그레이드했으며 정상적으로 작동하는 것으로 보입니다.

17

실제로 장면 뒤에 이유는 다음과 같습니다

은 NHibernate에이 값이 null의 DB에서 행을 읽을 때, 그 세션이 기억하는 것입니다. 객체가 NHibernate에 의해 rehydrate되면 Date는 DateTime.MinValue 값으로 설정됩니다. 세션이 db와 동기화되면, NHibernate는 currentState와 previousState가 다르기 때문에 무언가가 변경되었다고 가정하고 행을 업데이트하려고 시도합니다. DateTime.MinValue가 SqlServer datetime 열에 들어 가지 않기 때문에 실패합니다.

해결 방법 : 다음 중 하나를 입력하여 날짜를 null로 지정할 수 있습니까? 날짜 시간이 끝나면 DateTime? 또는 Null 허용

COMPLET의 문서에서 찾을 수 있습니다 : 그냥 참고로 nhibernate-sqldatetime-overflow-issue

+0

내 문제가 해결되었습니다. –

0

, 나는 데이터 액세스에 접근 내장의 다양한 NHibernate에 대한 기존 응용 프로그램을 마이그레이션하는 작업을하고있다. 이 문제는 신속하게 제기되었으며 기존 기능적 응용 프로그램 코드에 미치는 영향을 최소화하는 쉬운 솔루션을 발견했습니다. 경우에 따라 계층별로 마이그레이션하므로 데이터 클래스 인터페이스는 가능한 한 안정적으로 유지되어야합니다.여기에 대한 해결책은 공용 인터페이스에 DateTime 유형을 계속 사용하고, 확장 필드 메소드를 MinValue에서 null로 변환하고 접근 자의 비공개 필드로 다시 변환하는 비공개 필드 유형에 추가하고, nHibernate를 비공개 필드에 매핑하는 것입니다.

1

JF 내가 아닌 널 (NULL) 날짜 열이 같은 문제가 테이블과 저장에 SqlDateTime 오버 플로우에 직면했다.

제 경우에는 실제 세션에서 세션로드를 사용하여 이전에로드 된 일부 객체에 대한 업데이트를 일으키는 session.flush가 저장됩니다. 이 개체에는 'nullable datetime 필드가 사용 된 날짜/시간 필드'문제가있었습니다.

다른 말로하면 : 저장 또는 업데이트하기 전에 session.flush를 수행하여 문제가 동일한 세션 객체의 이전 사용으로 인한 것인지 여부를 확인하십시오.

희망은 누구에게나 도움이됩니다.