我可以在NHibernates二级缓存中缓存具有非映射属性的实体吗?
您好,我已将SessionFactory设置为缓存实体和查询:我可以在NHibernates二级缓存中缓存具有非映射属性的实体吗?,nhibernate,caching,active-directory,entity,Nhibernate,Caching,Active Directory,Entity,您好,我已将SessionFactory设置为缓存实体和查询: private ISessionFactory CreateSessionFactory() { var cfg = new Configuration().Proxy( properties => properties.ProxyFactoryFactory<DefaultProxyFactoryFactory>()).DataBaseIntegration( pr
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();
}
私有ISessionFactory CreateSessionFactory()
{
var cfg=新配置().Proxy(
properties=>properties.ProxyFactoryFactory()).DataBaseIntegration(
属性=>
{
properties.Driver();
properties.ConnectionStringName=this.namedConnection;
properties.dialogue();
}).AddAssembly(this.resourceAssembly).Cache(
属性=>
{
properties.UseQueryCache=true;
properties.Provider();
properties.DefaultExpiration=3600;
});
AddMapping(this.DomainMapping);
newschemaupdate(cfg).Execute(true,true);
返回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);
});
}
}
公共类用户映射:EntityMapping
{
公共用户映射()
{
本表(“用户”);
这是我的财产(
x=>x.CorpId,
mapper=>mapper.Column(
c=>
{
c、 名称(“公司ID”);
c、 UniqueKey(“UKUserCorporateId”);
c、 不可为空(true);
}));
这个,设定(
x=>x.桌子,
映射器=>
{
映射表(“桌面用户”);
mapper.Key(km=>km.Column(“UserId”);
逆映射(假);
映射器.Cascade(Cascade.All | Cascade.delete孤儿| Cascade.Remove);
},
rel=>rel.ManyToMany(mapper=>mapper.Column(“DeskId”));
这是缓存(
映射器=>
{
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; }
}
公共类用户:实体,IUser
{
公共虚拟字符串CorpId{get;set;}
公共虚拟ISet桌面{get;set;}
公共虚拟邮件地址EmailAddress{get;set;}
公共虚拟字符串名
{
收到
{
返回string.Format(CultureInfo.CurrentCulture,“{0},{1}”、this.namite、this.GivenName);
}
}
公共虚拟字符串GivenName{get;set;}
公共虚拟字符串姓氏{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 users=this.session.Query().Cacheable().ToList();
if(users.Any(user=>user.EmailAddress==null))
{
UserEditor.UpdateThroughActiveDirectoryData(用户);
}
返回this.View(新的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);
var user=this.session.Get(id);
如果(user.EmailAddress==null)
{
UpdateThroughActiveDirectoryData(用户);
}
返回此.View(用户);
UpdateThroughActiveDirectory方法可以工作,但每次我从缓存中获取数据时都会执行,更新的实体不会保留额外的数据。是否有办法将此数据也存储在nhibernates二级缓存中?NHibernate不会将整个实体缓存在二级缓存中。它仅缓存映射属性中的状态/数据。您可以在此处阅读更多信息: 在那篇文章的评论中有一个有趣的讨论进一步解释了这一点: Frans Bouma:对象需要序列化,不是吗?我们讨论的是多个AppDomain。我不知道还有什么 高效:依赖数据库服务器的缓存或传输 对象使用序列化层前后移动 Ayende Rahien:不,他们不需要这个。这是因为NHibernate不会将实体保存在缓存中。这样做会打开大门 你必须遵守比赛条件。NHibernate单独保存实体数据, 通常由基本数据组成(这是数据库可以 毕竟是商店)。一般来说,命中缓存更有效 服务器,因为它们很容易扩展到高度,并且 不涉及I/O