2013-06-18 4 views
0

나는 유창한 nhibernate를 사용하고있다, 나는 삭제 폭포를 켤 것이다. 하지만 난 일하지 않아. foregin 키만 삭제합니다. 다음 구성 능통 자 NHibernate :유창한 nhibernate 삭제 캐스케이드

 public virtual void TreatConfiguration(NHibernate.Cfg.Configuration configuration) 
    { 
     var update = new SchemaUpdate(configuration); 
     update.Execute(false, true); 
    } 

    public ISessionFactory CreateSessionFactory(string istanza, string db) 
    { 
     //string server = @"BRUX-PC\SQLEXPRESS"; 
     //int port = 1433; 
     string server = istanza; 
     string database = db; 
     const string user = "xxxx"; 
     const string password = "xxxx"; 

     var connectionString = string.Format("Server={0};Database={1};User Id={2};Password={3};", 
              server, database, user, password); 

     var autoMap = AutoMap.AssemblyOf<AggregateBase>() 
          .Where(t => typeof (AggregateBase).IsAssignableFrom(t)) 
          .Conventions.Add(
           ConventionBuilder.HasMany.Always(x => x.Cascade.AllDeleteOrphan()), 
           PrimaryKey.Name.Is(o => "Id"), 
           ForeignKey.EndsWith("Id"), 
           DefaultLazy.Never(), 
           DefaultCascade.All(), 
           DynamicUpdate.AlwaysTrue(), 
           DynamicInsert.AlwaysTrue() 
      ); 



     return Fluently.Configure() 
         .Database(
          MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)) 
         .Mappings(m => m.AutoMappings.Add(autoMap)) 
         .ExposeConfiguration(TreatConfiguration) 
         .BuildSessionFactory(); 
    } 

내 컨트롤러 :

     contabilitaRepository.RemoveByIdFattura(testataContabilita.IdFattura); 

내 저장소 :

 public void RemoveByIdFattura(Guid? id) 
    { 
     var userToDelete = 
      repository.Single(c => c.IdFattura == id); 

     repository 
      .Remove(userToDelete); 
    } 

내 모델 :

public class TestataContabilita : AggregateBase 
    { 
     public virtual Guid IdFattura 
     { 
      get; 
      set; 
     } 
     public virtual int NumeroRegistrazione 
     { 
      get; 
      set; 
     } 
     public virtual string TipoVendita 
     { 
      get; 
      set; 
     } 

     public virtual IList<CorpoContabilita> CorpoContabilita { get; set; } 


    } 

    public class CorpoContabilita : AggregateBase 
    { 

     public virtual int NumeroRegistrazione 
     { 
      get; 
      set; 
     } 
     public virtual int? ControPartita 
     { 
      get; 
      set; 
     } 
     public virtual string Automatico 
     { 
      get; 
      set; 
     } 
} 

나는 eliminatio을 실행할 때 n, "CorpoContabilita"가 남아있는 동안 "TestataContabilita"만 삭제하지만 foregin 키는 삭제합니다. 왜?

답변

1

당신은 (X => x.Cascade.AllDeleteOrphan() ConventionBuilder.HasMany.Always을 할 수 있습니다. 역()

를 매핑에

또한 당신은

을 할 필요가 TestataContabilita.CorpoContabilita.Clear();.

컬렉션에서 항목을 제거하는

+0

당신은 대답하지만, "Inverse"를 인식하지 못해 "ConventionBuilder.HasMany.Always (x => x.Cascade.AllDeleteOrphan(). Inverse())"를 호출 할 수 없습니다. "TestataContabilita.CorpoContabilita.Clear();"를 삽입하십시오. 만약 내가 "repository.Remove (userToDelete);"전에 내 저장소에 삽입 내가 커밋하면 아이를 지우지 마라 = ( – Brux88

1

내가 재현하려고 한 당신 케이스. 나는 일종의 저장소를 구현했고 당신의 매핑은 단지 그렇게 될 뿐이다. CorpoContabilita 컬렉션으로 testataContribilita 객체를 삭제합니다.

하지만 실수로 저장소에서 몇 가지 실수를 저질렀습니다. 외래 키에서도 null이 발생했습니다. 사실 그들은 시행 착오로 인해 testataContribilita를 삭제하기 전에도 null이었습니다.

그래서 어떤 저장소 구현을 사용합니까? 세션 및 트랜잭션 객체로 어떻게 작업합니까? 저장하는 개체는 무엇입니까? 전체 구현으로 어딘가에 프로젝트를 업로드 할 수 있습니다.