2009-07-14 1 views
5

NHibernate는 새로운 엔티티를 저장할 때 어떻게 데이터베이스 - 디폴트 값을 사용할 수 있습니까?

public class Entity 
{ 
    public Entity() { } 
    public virtual int Id { get; private set; } 
    public virtual DateTime DateCreated { get; private set; } 
} 

다음 간단한 NHibernate 매핑으로 매핑되었습니다.

<class name="Entity" mutable="false"> 
    <id name="Id"> 
     <generator class="native"> 
    </id> 
    <property name="DateCreated"/> 
</class> 

다음과 같은 간단한 데이터베이스 스키마 :

CREATE TABLE Entity (
    Id int IDENTITY(1,1) PRIMARY KEY, 
    DateCreated datetime NOT NULL DEFAULT getUtcDate() 
) 

Entity 데이터베이스에 저장, 어떻게 당신은 그 값이 null 인 경우 DateCreated 컬럼에 대한 데이터베이스의 기본 값을 사용 NHibernate에 지시 하는가? 또한, 내가 어떻게 NHibernate에이 삽입시 DateCreated 필드의 값으로 getUtcDate() 함수의 결과를 사용하도록 지정할 수 있습니까? 내가 쉽게 엔터티 생성자에

DateCreated = DateTime.Now; 

을 추가 할 수 있지만

,이 응용 프로그램 서버의 로컬 클럭을 사용하고, 나는 여러 응용 프로그램 서버와 각이있을 때 일관성을 보장하기 위해 데이터베이스의 로컬 클럭을 사용합니다 잠재적으로 동기화되지 않은 로컬 클록.

+0

은 NHibernate에 질문에 대답 할 수 없습니다, 그러나 일반적으로 당신은 UTC로 데이터베이스에 날짜를 저장할 수 있습니다. 소스가 무엇이든간에 UTC는 모든 서버에서 동일합니다 (시계가 정확하다고 가정). –

+0

일반적으로 예, 동의했습니다. 그 이유는 getDate() 대신 getUtcDate()를 지정했기 때문입니다. :) – iammichael

답변

4

당신은 속성이 데이터베이스에 의해 생성되도록 지정할 수 있습니다

generated="insert" 

자 NHibernate가 INSERT 후에 알고있는이 방법을 그 엔티티를 새로 고쳐야하지만 업데이트 후 DateCreated는 변경되지 않습니다.

또한 지정해야 할 수도 있습니다 :

update="false" insert="false" 

I가 생성되지 사용 된 적이과 NHibernate에 그를 설정하는 추론 또는 명시 적으로 할 필요가 있는지 확실하지 않습니다.

+0

잘 모르겠 나는 어떻게 워드 프로세서 (http://nhforge.org/doc/nh/en/index.html#mapping-generated); 나는 적어도 두 번 보았을 때 맹세 했어. – iammichael

+0

의사 링크가 더 마음에 듭니다. NH Forge를 정기적으로 만들어야합니다. – anonymous

+0

불행히도이 질문에 완전히 대답하지 않습니다. 삽입을 위해 작동하는 동안, 업데이트를 위해서는 데이터베이스 트리거를 사용해야합니다. NHibernate는 여전히 UDPATE의 일부로 "DEFAULT"또는 "GETUTCDATE()"를 전송하지 않습니다. –

1

비슷한 문제가있었습니다. 내 클래스 매핑에 dynamic-insert="true" 속성을 추가해야했습니다. 문서에서
는 :

dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null. 
관련 문제