2

Извините за стену текста, пожалуйста, не TLDR. У меня есть очень простая объектная модель, в основном этоПереопределение переопределения FNH на HasMany

public class Colony 
{ 
    public virtual IList<Ant> Ants { get; set; } 
} 

public class Ant 
{ 
    public bool Dead { get; set } 
    public virtual IList<Egg> Eggs { get; set; } 
} 

public class Egg 
{ 
    public bool Dead { get; set } 
    public virtual int IncubationPeriod { get; set; } 
} 

Вы получаете идею. Поэтому я объявил два переопределения отображения.

public class ColonyMappingOverride : IAutoMappingOverride<Colony> 
{ 
    public void Override(AutoMapping<Colony> mapping) 
    { 
     mapping.HasMany(c => c.Ants).Where(x => !x.Dead); 
    } 
} 

public class AntMappingOverride : IAutoMappingOverride<Ant> 
{ 
    public void Override(AutoMapping<Ant> mapping) 
    { 
     mapping.HasMany(c => c.Eggs).Where(x => !x.Dead); 
    } 
} 

Поэтому, когда я беру данные из БД, я получаю несогласованные данные.

Например:

Colony.Ants не содержит никаких мертвых муравьев (как и ожидалось), однако Colony.Ants [0] .Eggs содержит все яйца ... мертвые или нет.

Если я вызываю Session.Refresh (Colony.Ants [0]), мертвые яйца удаляются.

Кто-нибудь знает, почему ленивая загрузка игнорирует предложение Where в отношении переопределения муравьев?

+0

делает изменения результата, если вы удалите переопределение? – Mert

+0

Нет, единственное, что случается, это когда я выполняю сеанс. Обновлять его больше не удаляет мертвые яйца. – Stewert

+0

Не могли бы вы убедиться, что ваши переопределения выполняются по настройке http://stackoverflow.com/questions/6413767/can-auto-mappings-conventions-work-with-mapping-overrides – Mert

ответ

0

это работает для меня, используя FNH 2.0.1.0 и NH 4.0.0.4000 и после фиксированного кода

public class Colony : Entity 
{ 
    public Colony() 
    { 
     Ants = new List<Ant>(); 
    } 
    public virtual IList<Ant> Ants { get; set; } 
} 

public class Ant : Entity 
{ 
    public Ant() 
    { 
     Eggs = new List<Egg>(); 
    } 
    public virtual bool Dead { get; set; } 
    public virtual IList<Egg> Eggs { get; set; } 
} 

public class Egg : Entity 
{ 
    public virtual bool Dead { get; set; } 
    public virtual int IncubationPeriod { get; set; } 
} 

public class ColonyMappingOverride : IAutoMappingOverride<Colony> 
{ 
    public void Override(AutoMapping<Colony> mapping) 
    { 
     mapping.HasMany(c => c.Ants).Where(x => !x.Dead); 
    } 
} 

public class AntMappingOverride : IAutoMappingOverride<Ant> 
{ 
    public void Override(AutoMapping<Ant> mapping) 
    { 
     mapping.HasMany(c => c.Eggs).Where(x => !x.Dead); 
    } 
} 

код

var config = Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.InMemory().ShowSql().FormatSql()) 
    .Mappings(m => m 
     .AutoMappings.Add(AutoMap.AssemblyOf<Ant>() 
      .Conventions.Add(DefaultCascade.All()) 
      .Override<Colony>(new ColonyMappingOverride().Override) 
      .Override<Ant>(new AntMappingOverride().Override) 
     ) 
    ) 
    .BuildConfiguration(); 

using (var sf = config.BuildSessionFactory()) 
using (var session = sf.OpenSession()) 
{ 
    new SchemaExport(config).Execute(true, true, false, session.Connection, null); 

    using (var tx = session.BeginTransaction()) 
    { 
     session.Save(new Colony 
     { 
      Ants = 
      { 
       new Ant 
       { 
        Dead = true, 
        Eggs = 
        { 
         new Egg { Dead = true, IncubationPeriod = 1 }, 
         new Egg { Dead = false, IncubationPeriod = 2 }, 
        } 
       }, 
       new Ant 
       { 
        Dead = false, 
        Eggs = 
        { 
         new Egg { Dead = true, IncubationPeriod = 1 }, 
         new Egg { Dead = false, IncubationPeriod = 2 }, 
        } 
       }, 
      } 
     }); 

     tx.Commit(); 
    } 
    session.Clear(); 

    var result = session.QueryOver<Colony>() 
     .Fetch(c => c.Ants).Eager 
     .SingleOrDefault(); 

    Console.WriteLine(result.Ants[0].Eggs.All(e => !e.Dead)); 
}