2012-11-28 4 views
0

약간의 호기심. 나는 각각 UserPhoto, UserMatchInterest, UserPreference 객체의 bag을 포함하는 User 객체를 가진다. 가방의 각 항목에 상위 사용자에 대한 참조를 지정하고 nhibernate를 사용하여 처음으로 사용자 객체를 만들면 자동으로 UserPhoto, UserMatchInterest 및 UserPreference 객체가 자동으로 만들어 지도록 양방향 매핑이 정렬되어 있습니다. userId를 부모 User 객체로 설정하여 잘 작동하는 콜렉션 가방.NHibernate Merge에서 Bag 항목 업데이트하기

예를 들어, UserPhoto 테이블에는 PhotoId PK 열과 UserId FK 열이 있습니다. UserPhoto 개체는 PhotoId 속성과 UserId가 아닌 User 속성을 가지므로 UserId를 보유하는 대신 부모에 대한 참조를 보유하고 Users PK를 기반으로 DB 열을 채 웁니다.

내가 가진 문제는 사용자 개체를 모두 한 번에 업데이트하려는 경우입니다. 나머지 User 개체는 잘 업데이트되지만 사진의 경우 데이터베이스에 새 사진이 만들어집니다. 이유는 그들이 분리 된 객체를 다루는 ASP.NET 웹 사이트로 받아 들일 수있는 이전 사진 세션 객체에 전혀 연결되지 않았기 때문에 이해할 수 있습니다. 그러나 그것은 오래된 것들을 떠난다. 따라서 사진 ID가 1 &이고 UserId = 1 인 경우 업데이트가 끝나면 UserId = 1 인 사진 1,2,3 &이 표시됩니다. 내가 원하는 것은 사진 1 & 2를 삭제하고 그 대신에 3 & 4를 삽입하는 것입니다.

나는 컬렉션으로 독립적으로 검색하고 첫 거래에서 삭제하는 것을 시도했다, 그러나 나는 메시지를 삭제하는

Message = "deleted object would be re-saved by cascade (remove deleted object from associations) 

코드를 얻을 수

// First delete existing photos, interests and preferences 


     var photos = from row in repository.GetItemsAsQuery<UserPhoto>() 
        where row.User.UserId == user.UserId 
        select row; 
     repository.DeleteItems(photos.ToList()); 

     var interests = from row in repository.GetItemsAsQuery<UserMatchInterest>() 
         where row.User.UserId == user.UserId 
         select row; 
     repository.DeleteItems(interests.ToList()); 

     var preferences = from row in repository.GetItemsAsQuery<UserPreference>() 
          where row.User.UserId == user.UserId 
          select row; 
     repository.DeleteItems(preferences.ToList()); 

     // Now update the user object and re-add the above linked items 
     repository.UpdateItem(user); 

오류가됩니다 다음과 같습니다 저장소에 던져 .DeleteItems (interests.ToList()); 첫 번째 삭제는 정상적으로 처리되지만 모든 트랜잭션이 삭제됩니다.

내 질문에 올바른 방식으로 업데이트해야하는 다른 개체가있는 DB 개체를 업데이트하는 것이 맞습니까? 수동으로 ID를 설정하지 않고 기존 사진 개체를 업데이트 할 수있는 방법이 없습니다. 사용자가 모든 사진을 바꾸거나 추가/삭제할 수 있으므로 기존 사진을 삭제하고 새로 추가하는 것이 더 깔끔할 수 있습니다. 그러나 기존 사진을 삭제하려면 어떻게합니까? 캐스케이드 오류가 발생하지 않는 것입니까? Cascade.AllDeleteOrphan 컬렉션의 일부가 아닌를 automaticly 아이를 모두 삭제됩니다 : 당신의 설명에서

답변

0

내가

public class User 
{ 
    public virtual int Id { get; set; } 

    public virtual ICollection<Photo> Photos { get; private set; } 
} 

public class Photo 
{ 
    public User Parent { get; set; } 
    public virtual string Name { get; set; } 
    public virtual byte[] Data { get; set; } 
} 

다음 매핑

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

     HasMany(x => x.Photos) 
      .AsSet() // no duplicate entries, allows NH to optimise some things 
      .Cascade.AllDeleteOrphan() 
      .Component(c => 
      { 
       c.ParentReference(x => x.Parent); 
       c.Map(x => x.Name); 
       c.Map(x => x.Data); 
      }); 
    } 
} 

주 같을 것이다 다음 클래스를 구상 더 이상

관련 문제