2016-05-16 4 views
0

У меня есть класс, который имеет список абстрактного класса:NHibernate не удаляя сирот на обновление

public class Foo 
{ 
    public int Id { get; set; } 
    public IList<Bar> Bars { get; set; } 
} 

public abstract class Bar 
{ 
    public int Id { get; set; } 
} 

Я очерчен Bars как таковой:

HasMany(f => f.Bars).Cascade.AllDeleteOrphans(); 

Однако, когда я обновлю Foo, чтобы удалить Bar, он не удаляет сироту, но он устанавливает столбец Foo_id Bar на NULL?

Я прочитал и увидел ответы, говоря, чтобы инвертировать HasMany поэтому я попытался:

HasMany(f => f.Bars) 
    .Inverse() 
    .Cascade.AllDeleteOrphans(); 

Но тогда при сохранении Bar всегда NULL как Foo_id. Это был также случай, когда я попытался добавить KeyColumn:

HasMany(f => f.Bars) 
    .Inverse() 
    .KeyColumn("Foo_id") 
    .Cascade.AllDeleteOrphans(); 
+0

показать код, который используется для удаления бара –

ответ

0

Используя эти отображения:

public class FooMap : ClassMap<Foo> 
{ 
    public FooMap() 
    { 
     Id(x => x.Id); 
     HasMany(f => f.Bars).Inverse().Cascade.AllDeleteOrphans(); 
    } 
} 
public class BarMap : ClassMap<Bar> 
{ 
    public BarMap() 
    { 
     Id(x => x.Id); 
     References(x => x.Foo); 
    } 
} 

Чтобы удалить, необходимо разъединить панель с обув из обоих способов:

// get foo object 
var foo = dao.GetFooByID(1); 

var barToRemove = foo.Bars[0]; // find the first bar 

// disassociate the objects to properly trigger cascade deletion 
barToRemove.Foo = null; 
foo.Bars.Remove(barToRemove); 

dao.SaveFoo(foo); 

С другой стороны, чтобы добавить, вам также необходимо связать объекты в обоих направлениях:

// get foo object 
var foo = dao.GetFooByID(1); 

var barToAdd = new Bar(); // new bar to add 

// associate the objects to properly trigger cascade save 
barToAdd.Foo = foo; 
foo.Bars.Add(barToAdd); 

dao.SaveFoo(foo); 
+0

Это то, что я делал, кроме 'Bar' не имеет ссылки на' Foo'. – maddisoj

+0

Обратитесь к отношениям между Employee and Store в примере здесь: https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started –

+0

Как Bar знает, к какому Foo он принадлежит? Только FooID? По опыту, чтобы каскадирование работало правильно, вам нужно иметь ссылку на объект от дочернего элемента к родительскому. Я обновил свой ответ, чтобы показать более полные сопоставления. –

 Смежные вопросы

  • Нет связанных вопросов^_^