2016-08-09 3 views
1

Ich habe so viele Artikel über die Deaktivierung von Fluent NHibernate Lazy Loading gelesen, aber keiner von ihnen funktioniert. Ich möchte das Lazy Loading global deaktivieren. Kann mir bitte jemand sagen, wie man das macht.Wie wird das verzögerte Laden global in Fluent NHibernate deaktiviert?

Siehe unten Fluent NHibernate-Konfiguration:

_sessionFactory = Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
       .ConnectionString(_connectionString) 
       .ShowSql()) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>() 
       .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never())) 
      .BuildSessionFactory(); 

Antwort

0

Sie global IReferenceConvention hinzufügen können verzögertes Laden für bestimmte Fremdschlüssel entfernen:

public class AggregateAttribute : Attribute { 
} 

public class ReferenceConvention : IReferenceConvention, IReferenceConventionAcceptance, IHasManyConvention, IHasManyConventionAcceptance { 
    public void Apply(IManyToOneInstance instance) { 
     instance.Fetch.Join(); 
    } 

    public void Accept(IAcceptanceCriteria<IManyToOneInspector> criteria) { 
     criteria.Expect(x => x.Property != null && x.Property.MemberInfo.GetCustomAttributes(typeof(AggregateAttribute), false).Any()); 
    } 

    public void Apply(IOneToManyCollectionInstance instance) { 
     instance.Fetch.Select(); 
    } 

    public void Accept(IAcceptanceCriteria<IOneToManyCollectionInspector> criteria) { 
     criteria.Expect(x => x.Member != null && x.Member.IsDefined(typeof(AggregateAttribute), false)); 
    } 
} 

Verwenden Aggregat Attribut als:

public class FirstRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
    // Disable lazy load 
    [Aggregate] 
    public SecondRecord SecondRecord { get; set; } 
    // Lazy load 
    public ThirdRecord ThirdRecord { get; set; } 
} 

public class SecondRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

public class ThirdRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

Dieser Code wird das verzögerte Laden für jede Eigenschaft mitentfernenAttribut auf es, wenn Sie sich für alle Eigenschaften faul deaktivieren wollen, dann diese Attribut und Update-Konvention Klasse entfernen sein:

public class ReferenceConvention : IReferenceConvention, IHasManyConvention{ 
    public void Apply(IManyToOneInstance instance) { 
     instance.Fetch.Join(); 
    } 
    public void Apply(IOneToManyCollectionInstance instance) { 
     instance.Fetch.Select(); 
    } 
} 

Mit diesem Code nhibernate wird automatisch laden viele zu einer Beziehung von verknüpften Datensätze mitmachen dieselbe Abfrage und eins zu viele durch separate Abfrage.

, es zu benutzen, einfach neue Konvention registrieren:

.Conventions.Add(new ReferenceConvention()) 
+0

Könnten Sie bitte einige Beispiele zeigen, wie das benutzen? –

+0

Bitte lesen Sie die aktualisierte Antwort auf, wie man es benutzt. – mdameer

+0

Noch lazy loading passiert. Ich möchte das Lazy Loading vollständig deaktivieren. Meine zugeordneten Eigenschaften sind also null. –

Verwandte Themen