gpt4 book ai didi

nhibernate - 如何使用一些初始化字段(Id 除外)创建 NHibernate 代理对象?

转载 作者:行者123 更新时间:2023-12-02 05:19:25 24 4
gpt4 key购买 nike

我想创建一个对象代理,类似于 ISession.Load 返回的内容,但一些字段已初始化。对于其他属性,在访问时,代理将从数据库中获取整个对象。考虑以下示例:

public class User
{
protected User() {

}

public User(int id, string username, string email) {
// ...
}

// initialize the following fields from other datasources
public virtual int Id { get; set; }
public virtual string UserName { get; set; }
public virtual string Email { get; set; }

// the rest of fields when accessed will trigger a select by id in the database
public virtual string Field1 { get; set; }
public virtual string Field2 { get; set; }
public virtual DateTime Field3 { get; set; }
public virtual ISet<Comment> Comments { get; set; }
}

Id、UserName、Email 在我的案例中是众所周知的,因此我可以创建一个包含这些字段的对象代理,而对于其他字段则保留默认代理行为。除了在数据库中找不到此 id 时抛出异常之外,如果预初始化字段不匹配或静默覆盖它们,我还可以抛出异常。我正在使用 NHibernate.ByteCode.CaSTLe 作为代理工厂。

编辑:这样做的目的是能够从实体中获得一些投影属性,这些属性可以在其他地方查询(比如 lucene 索引)并避免数据库调用。然后,我不想将这些字段包装在仅包含这些属性子集的自定义组件类中,而是想直接使用代理对象,以便我能够在需要时加载其余字段。在最好的情况下,我根本不会访问数据库,但在某些极端情况下,我也想访问其他字段。使用批处理可以大大降低 SELECT N+1 问题的影响。我想使用的假设版本的代码是:

        // create User object proxy with some fields initialized
var user = Session.Load<User>(5, new { UserName = "admin", Email = "admin@company.com" });
Console.WriteLine(user.Id); // doesn't hit the database
Console.WriteLine(user.UserName); // doesn't hit the database
Console.WriteLine(user.FullName); // doesn't hit the database
if (somecondition) {
Console.WriteLine(user.Field1); // fetches all other fields
}

最佳答案

您可以在查询中指定一个预先提取以实际检索所需的关联。这可以通过不同的方式完成,具体取决于您使用的查询样式(Criteria、Hql 或 LINQto NH)。但关键是改变抓取方式。

关于nhibernate - 如何使用一些初始化字段(Id 除外)创建 NHibernate 代理对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6343638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com