0

您好我已经设置了我的 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();
}

这是我的用户映射

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 方法有效,但每次我从缓存中获取数据时都会执行,更新的实体不会保留额外的数据。有没有办法将此数据也存储在 nhibernates 二级缓存中?

4

1 回答 1

0

NHibernate 不会在二级缓存中缓存整个实体。它仅缓存映射属性中的状态/数据。你可以在这里阅读更多信息:http: //ayende.com/blog/3112/nhibernate-and-the-second-level-cache-tips

该帖子的评论中有一个有趣的讨论,进一步解释了这一点:

Frans Bouma: 对象需要可序列化,不是吗?当我们谈论多个应用程序域时。我想知道什么更有效:依靠数据库服务器的缓存或使用序列化层来回传输对象。

Ayende Rahien: 不,他们不需要那个。这是因为 NHibernate 不会将实体保存在缓存中。这样做会让你面临竞争条件。NHibernate 单独保存实体数据,实体数据通常由原始数据组成(毕竟这是 DB 可以存储的)。一般来说,命中缓存服务器效率更高,因为它们很容易高度扩展,并且不涉及 I/O。

于 2012-06-13T14:44:33.063 回答