을 NULL로 모든 하위 외부 키를 설정 : 나는 자동 매핑을 사용하고될 saveOrUpdate()는 내가이 개 수업을 유창함 자 NHibernate와 NHibernate.Core 3 베타 1을 사용하고
public class Promotion
{
public Promotion()
{
PromotionEntrants = new List<PromotionEntrant>();
}
public virtual int Id { get; set; }
[Required]
public virtual string Name { get; set; }
...
public virtual IList<PromotionEntrant> PromotionEntrants { get; set; }
}
public class PromotionEntrant
{
public virtual int Id { get; set; }
...
public virtual Promotion Promotion { get; set; }
}
하는 내가 기대하는 스키마를 생성하고 대부분이 예상대로 작동하는 것 같습니다.
I/만들기 프로모션을 저장하기위한 다음과 같은 행동 (ASP.NET MVC 3 RC)이 있습니다
[HttpPost]
public ActionResult SavePromo(Promotion promo)
{
if (ModelState.IsValid)
{
// .SaveOrUpdateCopy(promo) results in the same SQL
NhSession.SaveOrUpdate(promo);
NhSession.Flush();
}
...
}
이 예상 실행 "업데이트 프로모션 ..."쿼리, 그러나 그것은 또한 다음을 실행을 :
UPDATE [PromotionEntrant] SET PromotionId = null WHERE PromotionId = @p0;@p0 = 1 [Type: Int32 (0)]
어떻게 이런 일이 발생하지 않도록 할 수 있습니까?
나의 유일한 추측은 Promotion 객체의 비어있는 List (NH Session에 붙어 있지 않은 ASP.NET MVC에 의해 생성 됨)을 보았습니다. 즉, PromotionEntrants가 없어야 함을 의미합니다. 이를 방지하기 위해 다음 자동 매핑 무시를 만들었지 만 차이는 없습니다.
public class PromotionMappingOverride : IAutoMappingOverride<Promotion>
{
public void Override(AutoMapping<Promotion> mapping)
{
mapping.HasMany(p => p.PromotionEntrants)
.Cascade.None();
}
}
어떤 도움을 주시면 감사하겠습니다.
관계의 부모 측을 역으로 설정하는 것이 핵심이었던 것 같습니다. Cascade.None()을 제거하고 .Inverse()를 PromotionMappingOverride에 추가 했으므로 해당 조치는 예상대로 프로모션 만 업데이트합니다. 자동 매핑이 기본적으로 Inverse로 부모 측을 설정하지 않는다고 생각하십니까? 거래 도움말 주셔서 감사합니다. 한 번만 업데이트해야하므로 트랜잭션이 불필요하다고 생각했지만 일부 경우 매핑이 너무 많은 것으로 가정합니다. –
FNH가 inverse = true로 양방향 관계를 설정하는지 확인하지 않았습니다. 그렇지 않은 경우, 부모와 자녀가 모두 관계를 관리하고 있다고 생각하기 때문에 FK에 대한 추가 업데이트가 있습니다. IMHO 오토 맵핑은 시작과 반복에 환상적입니다.하지만 일단 모델이 안정되면 ClassMap과 관습으로 전환합니다. 다행히 나는 해결책을 제시하는 올바른 길을 찾아 도울 수있었습니다. –