2009-11-10 3 views
4

NHibernate 매핑을 수행하기 위해 Fluent NHibernate를 사용하고 있습니다. 그러나 이제는 어떻게 해결해야할지 모르겠다는 문제가 있습니다. 문제의 단순화 된 버전은 다음과 같습니다.전체 개체를 업데이트하지 않고 Fluent NHibernate의 특정 클래스 필드를 업데이트하는 방법은 무엇입니까?

public class User { 
    public virtual int Id { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

이 관련 유창함 NHibernate에 클래스지도

public class UserMap : ClassMap<User> { 
    public UserMap() { 
     Id(x => x.Id); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 

나는이 웹 양식을 가지고 있습니다 :

나는 사용자 클래스가 있습니다. 하나의 양식을 사용하면 사용자 이름을 변경할 수 있고 두 번째 양식을 사용하면 사용자 성을 변경할 수 있습니다. 첫 번째 양식의 경우

: 두 번째 양식의 경우
UPDATE [users] SET firstname='new first name' WHERE id=1

: 무엇을 달성하려고하는 것은이 같은 간단한 SQL 문입니다
UPDATE [users] SET lastname='new last name' WHERE id=1

현재 NHibernate에가 다음과 같은 SQL을 수행 내 데이터베이스 :
UPDATE [users] SET firstname=null, lastname='new last name' WHERE id=1

실제 응용 프로그램의 문제는 너무 많다는 것입니다. 속성뿐만 아니라 일부 큰 개체 (뿐만 아니라 액세스 제한)을 업데이 트하고, 전체 개체를 업데이 트하는 것이 무의미한 것처럼 보이기를 원할 때 /해야 할 일은 하나의 속성을 업데이트하는 것입니다.

나는 누군가가 이것을 깨달을 수있는 방법에 대한 조언을 해 줄 수 있기를 바라고, 이것을 해결하기 위해 올바른 방향으로 나를 가리키기를 바랍니다.

+0

더 논의 여기를 참조하십시오 : http://stackoverflow.com/questions/1243390/what-is-the-best-approach-to-update-only-changed-properties-in-nhibernate-when- se. 또한, 왜 단순성을 교환하고 즉시 많은 수작업을해야하는지 이해하지 못합니다. 솔루션을 사용해 보셨습니까? 동적 업데이트가 필요하지 않습니다 (FNH의 mapping.DynamicUpdate())? – queen3

+0

내 코드를 두 번 확인했습니다. FNH 매핑을 내 보내면 동적 업데이트가 활성화되어 있지만 차이점이없는 것으로 보입니다. 동일한 세션을 사용할 수 있도록 저장소를 다시 작성하기 만하면 업데이트 전에 선택하면 차이가 있는지 확인할 수 있습니다. –

답변

0

Hibernate가 옳은 일을하고 있지만, 문제는 스키마가 정규화를 필요로한다는 것을 나타냅니다.

+0

의견을 주셔서 감사합니다 Mcwafflestix. 필자는 질문을 올바르게 입력했는지 확신 할 수 없다. 단지 정규화에 너무 관심이 없다는 것을 확인하기위한 것이고, 나의 경우에는 디자인에 의한 성능 향상이다. 비정규 화에는 올바르게 사용될 때 많은 이점이 있습니다. ;-)."정규화"문제 외에도 NHibernate 질의를 최적화 할 수있는 가능한 해결책을 제시 할 수 있습니까? –

+0

일반적으로 정규화를 제안합니다. 여기에 문제가있다. 당신이 맞다. 정규화되지 않은 테이블은 많은 이점을 가질 수 있지만,이를 사용하는 단점 중 하나는 Hibernate와 같은 즉시 사용 가능한 솔루션을 사용자 정의하는 것이 어려울 수 있다는 것이다. 나는 당신이 당신의 상반 관계를 가중시킬 필요가 있다고 제안 할 것입니다; Hibernate의 테이블 접근을 커스터마이징 할 필요가있는) 비정규 화 된 데이터베이스를 유지하는 것이 스키마를 표준화하는 것보다 (그리고 Hibernate를 "있는 그대로"사용할 수있게하는 것보다) 더 중요합니까? 당신 만이 그 결정을 내릴 수 있습니다. 사물의 "정상화"문제에 관해서 이야기 할 것입니다. –

0

좋아, 그 덕분에 도움과 팁 Queen3 주셔서 감사합니다! 여기

내가 그것을 통해서 문제를 해결할 방법입니다 :이 작업을 수행하지만

using (var sf = Repository.CreateSessionFactory()) { 
    using (var s = sf.OpenSession()) { 
     using (var t = session.BeginTransaction()) { 
      var existingUser = s.Get<User>(editedUser.Id); 
      existingUser.LastName = editedUser.LastName; 
      s.SaveOrUpdate(existingUser); 
      t.Commit(); 
     } 
    } 
} 

는, 내가 같은 세션에서 첫 번째 데이터베이스에서 사용자 작업을 검색해야합니다. 좋은 점은 생성 된 SQL 문이 더티 성 필드를 업데이트한다는 것입니다. :-)

분리 된 사용자 인스턴스와 함께 작동시키지 못했습니다. 이전에했던 것과 비슷합니다. 이로 인해 사용자의 모든 필드가 업데이트됩니다.

using (var sf = Repository.CreateSessionFactory()) { 
    using (var s = sf.OpenSession()) { 
     using (var t = session.BeginTransaction()) { 
      s.SaveOrUpdate(editedUser); 
      t.Commit(); 
     } 
    } 
} 
관련 문제