2010-12-29 4 views
2

Json.NET을 사용하여 역 직렬화되도록 REST 웹 서비스를 통해 Javascript에서 JSON 컬렉션을 보내고 마지막으로 NHibernate를 사용하여 DB에서 업데이트합니다 (Fluent를 사용하고 있습니다) . 내가 Json.NET 역 직렬화를 위해 사용하고 설정은 다음과 같습니다Json.NET 및 NHibernate - 영구 객체 deserializing

 JsonConvert.DeserializeObject<T>(jsonString, 
     new JsonSerializerSettings { 
      PreserveReferencesHandling = PreserveReferencesHandling.Objects 
     }); 

내 JSON 객체는 다음과 같습니다

{ 
    "ID": 1, 
    "Name": "ObjectName", 
    "Keys": [ 
    { 
     "ID": 6, 
     "Name": "ID" 
    } 
    ] 
} 

개체의 속성을 수정, 심지어 자식 개체 (키)를 추가하고 수정하고 그런 다음 비 직렬화 작업이 효과적입니다. 그러나, 나는 자식 개체 삭제를 관리하는 방법을 알아낼 수 없습니다. 예를 들어 자식 개체 (Object.Keys.splice 사용)를 제거한 다음 업데이트하면 업데이트되는 부모 개체에 해당 개체가 들어 있지 않더라도 관련된 DB 레코드가 유지됩니다.

또한 매핑 파일에 'AllDeleteOrphan'도 설정했습니다.

// one-to-many 
    HasMany(x => x.Keys) 
     .Inverse() 
     .Cascade.AllDeleteOrphan(); 

개체가 deserialize되고 업데이트 될 때 javascript를 통해 제거 된 자식 개체가 모두 삭제되도록 보장 할 수있는 방법이 있습니까?

또한 NHibernate를 사용할 때 하위 개체를 업데이트 전에 Keys.Remove(item)을 통해 부모 컬렉션에서 수동으로 제거해야한다고 읽었습니다. 역 직렬화 및 업데이트하는 것이 훨씬 더 바람직 할 수 있습니다 (확장형은 말할 것도 없습니다). 어떤 기회?

답변

2

당신은 업데이 트를 할 수 있어야하고 그 변화를 계단식으로 볼 수 있어야합니다. 그러나이 문제는 컬렉션이 역으로 표시되는 것과 관련이 있다고 생각합니다.

Inverse = true (nhibernate의 .Inverse() 바인딩입니다.)는 "이 관계를 관리하지 않습니다"라고 말하는 것과 같습니다. 이 바인딩으로 인해 부모 개체는 자식이 관계를 관리하기 때문에 컬렉션을 삭제하거나 업데이트하지 않습니다.

이것이 의미가 있든 없든 나는 도메인에 대한 충분한 이해 없이는 말할 수 없습니다.

+0

안녕하세요, 저에게 다시 연락해 주셔서 감사합니다. 나는 그것을 제거하는 것을 시도하고, 아직도 삭제에 대한 문제가있다. Inverse 태그가 관계의 어느 쪽이 관계 그 자체가 아닌 저축 (레코드)을 담당했는지 항상 생각했기 때문에 혼란 스럽습니다. – Stumblor

+0

모든 것을 잡아라 - 매핑에서 Inverse()를 제거하면 DB의 외래 키를 nulling하는 효과가있었습니다. 효과적으로 관계를 종료합니다. 그래서 작동했습니다! 고아를 제거하면 승리 할 수 ​​있습니다. 감사. – Stumblor

+0

안녕하세요, 외래 키를 null로 설정하는 대신 레코드를 제거하는 방법을 알아 보셨습니까? – CraftyFella