2013-06-18 5 views
0

Я использую свободно nhibernate, я бы включил удаление каскада. но я не работаю. он удаляет только ключ foregin. Следующая конфигурация Fluent NHibernate:Свободный nhibernate delete cascade

 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, я удаляю только «TestataContabilita», пока «CorpoContabilita» остается, но только удаляет ключ foregin. Зачем?

ответ

1

Вы, возможно, придется сделать ConventionBuilder.HasMany.Always (х => x.Cascade.AllDeleteOrphan(). Inverse()

в отображении

Также вы должны сделать

TestataContabilita.CorpoContabilita.Clear();.

для удаления элементов из коллекции

+0

THX для вас ответ, но я не могу назвать «ConventionBuilder.HasMany.Always (x => x.Cascade.AllDeleteOrphan() .Inverse()), потому что он не распознает« Обратный », а затем где я должен вставить «TestataContabilita.CorpoContabilita.Clear();» если я вставляю его в свой репозиторий до «repository.Remove (userToDelete)»; когда я совершу, не удаляйте child = ( – Brux88

1

Я пытался воспроизвести ваш дело. Я реализовал какой-то репозиторий, и ваше отображение работает именно так, как предполагалось. Удаляет объект testataContabilita с коллекцией CorpoContabilita.

Но я случайно совершил несколько ошибок в репозитории вначале - и получил нуль в внешних ключах тоже. На самом деле они были пустыми даже до удаления testataContabilita - из-за ошибок в реализации.

Итак, в какой репозитории вы используете? Как вы работаете с объектами Session и Transaction? На каком объекте вы выполняете Сохранить? Может быть, вы можете загрузить свой проект где-нибудь с полной реализацией.