2012-06-13 51 views
0

嗨,我已經設置我的SessionFactory的緩存的實體和查詢:我可以在NHibernates二級緩存中緩存非映射屬性的實體嗎?

private ISessionFactory CreateSessionFactory() 
{ 
    var cfg = new Configuration().Proxy(
     properties => properties.ProxyFactoryFactory<DefaultProxyFactoryFactory>()).DataBaseIntegration(
      properties => 
      { 
       properties.Driver<SqlClientDriver>(); 
       properties.ConnectionStringName = this.namedConnection; 
       properties.Dialect<MsSql2005Dialect>(); 
      }).AddAssembly(this.resourceAssembly).Cache(
       properties => 
       { 
        properties.UseQueryCache = true; 
        properties.Provider<SysCacheProvider>(); 
        properties.DefaultExpiration = 3600; 
       }); 
    cfg.AddMapping(this.DomainMapping); 

    new SchemaUpdate(cfg).Execute(true, true); 
    return cfg.BuildSessionFactory(); 
} 

這是我的用戶映射

public class UserMapping : EntityMapping<Guid, User> 
{ 
    public UserMapping() 
    { 
     this.Table("USERS"); 
     this.Property(
      x => x.CorpId, 
      mapper => mapper.Column(
       c => 
       { 
        c.Name("CorporateId"); 
        c.UniqueKey("UKUserCorporateId"); 
        c.NotNullable(true); 
       })); 
     this.Set(
      x => x.Desks, 
      mapper => 
      { 
       mapper.Table("DESKS2USERS"); 
       mapper.Key(km => km.Column("UserId")); 
       mapper.Inverse(false); 
       mapper.Cascade(Cascade.All | Cascade.DeleteOrphans | Cascade.Remove); 
      }, 
      rel => rel.ManyToMany(mapper => mapper.Column("DeskId"))); 
     this.Cache(
      mapper => 
      { 
       mapper.Usage(CacheUsage.ReadWrite); 
       mapper.Include(CacheInclude.All); 
      }); 
    } 
} 

我想要做的就是讓用戶或查詢一些用戶和新增信息域對象並緩存更新的對象。

public class User : Entity<Guid>, IUser 
{ 
    public virtual string CorpId { get; set; } 

    public virtual ISet<Desk> Desks { get; set; } 

    public virtual MailAddress EmailAddress { get; set; } 

    public virtual string Name 
    { 
     get 
     { 
      return string.Format(CultureInfo.CurrentCulture, "{0}, {1}", this.SurName, this.GivenName); 
     } 
    } 

    public virtual string GivenName { get; set; } 

    public virtual string SurName { get; set; } 
} 

是這樣的:

var users = this.session.Query<User>().Cacheable().ToList(); 

if (users.Any(user => user.EmailAddress == null)) 
{ 
    UserEditor.UpdateThroughActiveDirectoryData(users); 
} 

return this.View(new UserViewModel { Users = users.OrderBy(entity => entity.Name) }); 

或本:

var user = this.session.Get<User>(id); 

if (user.EmailAddress == null) 
{ 
    UserEditor.UpdateThroughActiveDirectoryData(user); 
} 

return this.View(user); 

的UpdateThroughActiveDirectory方法工作,但每次我從緩存中的數據執行,更新的實體不守額外的數據。有沒有辦法將這些數據存儲在二級緩存中?

回答

0

NHibernate不會在二級緩存中緩存整個實體。它僅緩存來自映射屬性的狀態/數據。你可以閱讀更多關於它在這裏:http://ayende.com/blog/3112/nhibernate-and-the-second-level-cache-tips

有在該職位的評論一個有趣的討論,說明這一點遠一點:

弗蘭斯·鮑馬:對象需要序列化的,不是嗎?正如我們在談論多個AppDomain。我不知道什麼是更高效的:依靠數據庫服務器的高速緩存或使用序列化層來回傳輸對象。

Ayende Rahien:不,他們不需要那個。這是因爲NHibernate不會將實體保存在緩存中。這樣做會打開 你競爭條件。 NHibernate保存實體數據, 通常由原始數據組成(畢竟這是DB可以存儲的數據)。一般來說,點擊高速緩存服務器效率更高,因爲這些服務器非常容易擴展到高度,而且不涉及I/O。

相關問題