我可以在NHibernates二级缓存中缓存具有非映射属性的实体吗?

我可以在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

您好,我已将SessionFactory设置为缓存实体和查询:

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