NHibernate: Исключение с коллекцией, отображенной как каскадное удаление-удаление-сирота - PullRequest
2 голосов
/ 25 мая 2011

я периодически получаю следующее исключение:

На коллекцию с cascade = "all-delete-orphan" больше не ссылался экземпляр владельца объекта: Domain.Foo.Bars

Большинство результатов в Google для этого исключения указывают на то, что проблема возникает, когда вы разыменовываете коллекцию, вместо вызова Clear () для существующей коллекции и добавления новых сущностей. Однако это не моя проблема.

Вот весь соответствующий код:

public class Foo
{
     public int Id { get; set; }

     private Iesi.Collections.Generic.ISet<Bar> _bars = new HashedSet<Bar>();
     public virtual ICollection<Bar> Bars       
     {
         get { return _bars; }
     }
}

public class Bar
{
     public int Id { get; set; }
     public DateTime Expiry { get; set; }
}

public class FooDbMap : ClassMap<Foo>
{
    public FooDbMap
    {
        Id(x => x.Id);

        HasMany(x => x.Bars)
            .Access.CamelCaseField(Prefix.Underscore)
            .KeyColumn("FooId")
            .LazyLoad()
            .Where("Expiry > (select getdate())")
            .AsSet()
            .Cascade.AllDeleteOrphan();
    }
}

Вы увидите, что с помощью этого кода невозможно разыменовать коллекцию Bars , т. Е. Сделать это:

foo.Bars = new List<Boo>();

Что может быть причиной ошибки?

1 Ответ

0 голосов
/ 25 мая 2011

вы никогда не должны связываться с коллекционными ссылками, созданными NHibernate.Прежде всего, NH создает прокси-объекты для отложенной загрузки - замените этот прокси на List <>, и NH не сможет ни отложенно загрузить содержимое, ни обнаружить, были ли удалены какие-либо дочерние объекты.Во-вторых, NH отслеживает сопоставленные коллекции на предмет изменений (новых объектов, удалений и т. Д.).Простая замена коллекции новой, о которой NH ничего не знает, не очень хорошая идея.У NH по-прежнему будет ссылка на управляемую коллекцию, особенно если у вас есть NH, отслеживающий эту коллекцию и каскадирующий все изменения для дочерних элементов.

Я бы просто очистил коллекцию, чтобы удалить все сущности вместо замены всей коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...