NHibernate 프로젝트에서 작업 중이고 transient 엔티티 업데이트에 관한 질문이 있습니다. 다음과 같이NHibernate - 특정 속성을 'dirty'로 플래그 지정
기본적으로 워크 플로는 다음과 같습니다
- 는 DTO (돌출부)를 생성하고 클라이언트에 와이어를 보내. 이것은 엔티티의 작은 속성 집합입니다.
- 클라이언트가 변경된 DTO를 다시 보냅니다.
- DTO 속성을 해당 엔티티에 매핑하면 NH에서 UPDATE 문을 생성하고 실행할 수 있습니다. 나는 문제가 어디
- 저장 엔티티
포인트 4입니다. 현재 session.Merge() 메서드를 사용하여이 업데이트를 수행 할 수 있지만 업데이트하기 전에 db (엔트리 없음 2LC)에서 엔티티를 먼저로드해야합니다. 따라서 select 및 update 문이 모두 실행됩니다.
내가 원하는 것은 엔터티의 일시적인 인스턴스를 만들고, DTO에서 새 값을 매핑 한 다음 NH이 내가 변경 한 속성 만 사용하여 SQL 문을 생성하도록하는 것입니다. 엔티티 ID와 SET 절에 필요한 값이 이미 있으므로 추가 선택은 불필요합니다. NH에서 가능합니까?
현재 session.Update()를 사용하면 모든 속성이 업데이트 문에 포함되며 DTO의 일부가 아닌 초기화되지 않은 속성으로 인해 예외가 발생합니다.
본질적으로 어떤 엔티티 속성이 더티인지 지정하는 방법이 필요합니다. 따라서이 속성 만 업데이트에 포함됩니다.
== 편집 == 예
...
public class Person
{
public virtual int PersonId { get; set; }
public virtual string Firstname { get; set; }
public virtual string Nickname { get; set; }
public virtual string Surname { get; set; }
public virtual DateTime BirthDate { get; set; }
}
시험 케이스.
// Create the transient entity
Person p = new Person()
p.id = 1;
using (ISession session = factory.OpenSession())
{
session.Update(p);
// Update the entity – now attached to session
p.Firstname = “Bob”;
session.Flush();
}
나는 'UPDATE 사람 SET FIRSTNAME ='밥 'WHERE PersonID = 1'과 같은 SQL 문을 생성하는 기대했다. 대신 BirthDate가 초기화되지 않아서 DateTime이 범위를 벗어났습니다. SQL 문에는 필요하지 않으므로 BirthDate가 필요하지 않습니다. 어쩌면 이것은 가능하지 않을까요? 사전에
==/EDIT ==
감사합니다, 존
뿐만 아니라이를 이용의 성능에 영향이있다 , 정적 업데이 트를 사용하여 (전체) nhibernate가 sessionfactory가 만들어 질 때 업데이 트 문을 준비하는 방법으로 인해 더 performant 믿습니다. – DanP
안녕하세요 제임스, 응답 해 주셔서 감사합니다. 엔티티에 대해 DynamicUpdate (유동적 인 매핑)가 설정되어 있습니다. 어쩌면 예가 문제를보다 명확하게 설명해줍니다. 위의 편집 된 섹션을 참조하십시오. – John
이 경우에는 API가 직관적이지 않음에 동의해야합니다.) '실제'앱에서 session.Lock()을 사용하여 테스트했으며 원하는 SQL을 정확히 반환합니다. 이 James에 대한 당신의 도움에 대해 대단히 감사합니다. – John