gpt4 book ai didi

c# - NHibernate - 延迟加载问题 - 初始化 [] - 无法初始化代理 - 无 session 。”}

转载 作者:太空狗 更新时间:2023-10-29 20:05:48 27 4
gpt4 key购买 nike

您好,我使用 Fluent NHibernate,我对延迟加载有点困惑。

  1. 我查询了数据库中的对象
  2. 修改对象属性
  3. 用这个对象更新数据库

代码如下:

public class Credentials
{
public virtual int Id { get; set; }
public virtual string Nick { get; set; }
public virtual string Password { get; set; }
}

public class CredentialsMap : ClassMap<Credentials>
{
public CredentialsMap()
{
Id(x => x.Id);
Map(x => x.Nick).Column("NICK");
Map(x => x.Password).Column("PASSWORD");
Table("R_CREDENTAILS");
}
}

public class Status
{
public virtual int Id { get; set; }
public virtual string Msg { get; set; }
public virtual DateTime AddTime { get; set; }
}

public class StatusMap : ClassMap<Status>
{
public StatusMap()
{
Id(x => x.Id);
Map(x => x.Msg).Column("MESSAGE");
Map(x => x.AddTime).Column("ADD_TIME");
Table("R_STATUS");
}
}

public class Account
{
public virtual int Id { get; set; }
public virtual string SelfNick { get; set; }
public virtual Credentials Credentials { get; set; }
public virtual Status Status { get; set; }
}

public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
Id(x => x.Id);
Map(x => x.SelfNick).Column("SELF_NICK");
References(x => x.Credentials)
.Column("CREDENTIALS_ID")
.ForeignKey();
References(x => x.Status)
.Column("STATUS_ID")
.ForeignKey();
Table("R_ACCOUNTS");
}
}

NHibernate 配置类:

public class NHiberanteHelper
{
private static ISessionFactory _sessionFactory;

private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
InitializeSessionFactory();

return _sessionFactory;
}
}

private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(
@"Server=TEST\SQLEXPRESS;Database=SimpleNHibernate;Trusted_Connection=True;").
ShowSql()
)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Account>().Conventions.Add( DefaultCascade.All()))
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
.BuildSessionFactory();
}

public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}

用法如下:

    public class LoginDbHelper
{
public static Account GetAccount(string nick)
{
using (var session = NHiberanteHelper.OpenSession())
{
var account = (session.QueryOver<Account>()
.JoinQueryOver<Credentials>(a => a.Credentials)
.Where(c => c.Nick == nick));

if (account != null)
return account.SingleOrDefault();

return null;
}
}

public static void SaveOrUpdateAccount(Account account)
{
using (var session = NHiberanteHelper.OpenSession())
{
using (var trans = session.BeginTransaction())
{
session.SaveOrUpdate(account);
trans.Commit();
}
}
}
}

问题代码:

var actualAccount = LoginDbHelper.GetAccount(nick);

//modify
actualAccount.Status.Msg = "New status 2";
actualAccount.Status.AddTime = DateTime.Now;


LoginDbHelper.SaveOrUpdateAccount(account);

我收到这个错误:

{"Initializing[NHibernateSample1.Status#1]-Could not initialize proxy - no Session."}

堆栈跟踪:

 at NHibernate.Proxy.AbstractLazyInitializer.Initialize() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Proxy\AbstractLazyInitializer.cs:line 113
at NHibernate.Proxy.AbstractLazyInitializer.GetImplementation() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Proxy\AbstractLazyInitializer.cs:line 191
at NHibernate.ByteCode.Castle.LazyInitializer.Intercept(IInvocation invocation) in d:\CSharp\NH\NH\nhibernate\src\NHibernate.ByteCode.Castle\LazyInitializer.cs:line 61
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.StatusProxy.set_Msg(String value)
at NHibernateSample1.Program.Main(String[] args) in E:\C# PROJECTS\Samples\SimpleNHibernateClient\NHibernateSample1\Program.cs:line 215
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

我用谷歌搜索它,我认为它是由延迟加载引起的,因为在方法 GetAccount 中我关闭了 SESSION。这是我第一次尝试使用 NHibernate 那么如何才能正确解决这个问题呢?如果是,可以禁用 LAZY LOADING 怎么办?

最佳答案

你是对的。因为 NHibernate Session 在你的 GetAccount 方法中是关闭的(它只在 using 语句的范围内打开),你不能在这个方法之外加载额外的对象。有 2 个潜在的修复:

  1. 在操作级别创建 session (即在包含问题代码的方法中),然后在获取和保存方法中使用此 session 。您可以通过将 session 作为参数传递给方法来使用 session 。
  2. 将对象更改为不使用延迟加载。您可以通过将 .Not.LazyLoad() 添加到 Fluent 映射中的 Status 对象来执行此操作。

关于c# - NHibernate - 延迟加载问题 - 初始化 [] - 无法初始化代理 - 无 session 。”},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584315/

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