Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate将保存,但赢得´;不加载实体_Nhibernate_Fluent Nhibernate_Load_Save_Testing - Fatal编程技术网

NHibernate将保存,但赢得´;不加载实体

NHibernate将保存,但赢得´;不加载实体,nhibernate,fluent-nhibernate,load,save,testing,Nhibernate,Fluent Nhibernate,Load,Save,Testing,我收到了NHibernate 2.1.2.4000 GA和FluentNHibernate最新版本的一个非常奇怪的错误。我可以保存一个实体,但在调用Flush()和Clear()后无法将其加载回 这是我的实体: public class Application { public int Id { get; set; } public string Name { get; set; } public string KeyName { get; set; } public string De

我收到了NHibernate 2.1.2.4000 GA和FluentNHibernate最新版本的一个非常奇怪的错误。我可以保存一个实体,但在调用Flush()和Clear()后无法将其加载回

这是我的实体:

public class Application { public int Id { get; set; } public string Name { get; set; } public string KeyName { get; set; } public string Description { get; set; } public string Url { get; set; } public override bool Equals(object obj) { if (null != obj && obj is Application) { return ((Application)obj).Id == this.Id; } else { return base.Equals(obj); } } } 公共类应用程序 { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共字符串键名{get;set;} 公共字符串说明{get;set;} 公共字符串Url{get;set;} 公共覆盖布尔等于(对象对象对象) { if(null!=obj&&obj是应用程序) { return((Application)obj.Id==this.Id; } 其他的 { 返回基数等于(obj); } } } 我的配置映射:

public class ApplicationMap : ClassMap { public ApplicationMap() { Table("[Application]"); Not.LazyLoad(); Id(x => x.Id, "ApplicationId") .GeneratedBy.Identity(); Map(x => x.Name, "ApplicationName") .Nullable() .Length(50); Map(x => x.Description, "ApplicationDescription") .Nullable() .Length(200); Map(x => x.KeyName, "ApplicationKeyName") .Nullable() .Length(50); Map(x => x.Url, "ApplicationLink") .Nullable() .Length(50); } } 公共类应用程序映射:类映射 { 公共应用程序映射() { 表(“[申请]”); 不是。懒汉(); Id(x=>x.Id,“应用程序Id”) .GeneratedBy.Identity(); 映射(x=>x.Name,“ApplicationName”) .Nullable() .长度(50); 映射(x=>x.描述,“应用程序描述”) .Nullable() .长度(200); 映射(x=>x.KeyName,“ApplicationKeyName”) .Nullable() .长度(50); 映射(x=>x.Url,“ApplicationLink”) .Nullable() .长度(50); } } 如何创建ISession:

var _sessionFactory = Fluently.Configure() .Database( SQLiteConfiguration.Standard.InMemory() .ProxyFactoryFactory(typeof(ProxyFactoryFactory))) .Mappings( m => m.FluentMappings.AddFromAssemblyOf()) .ExposeConfiguration(cfg => Config = cfg) .BuildSessionFactory(); var _session = _sessionFactory.OpenSession(); var_sessionFactory=fluntly.Configure() .数据库( SQLiteConfiguration.Standard.InMemory() .ProxyFactoryFactory(类型为(ProxyFactoryFactory))) .映射( m=>m.FluentMappings.AddFromAssemblyOf()) .ExposeConfiguration(cfg=>Config=cfg) .BuildSessionFactory(); var_session=_sessionFactory.OpenSession(); 这是不起作用的代码:

Application myApp = new Application() { Id = 1, Description = "MyApp", KeyName = "MyApp", Name = "My App", Url = "http://www.myapp.com" }; _session.Save(myApp); var idMyApp = myApp.Id; _session.Flush(); _session.Clear(); _session = NHibernateHelper.CreateSession(); var a = _session.Load(idMyApp); 应用程序myApp=新应用程序() { Id=1, Description=“MyApp”, KeyName=“MyApp”, Name=“我的应用程序”, Url=”http://www.myapp.com" }; _session.Save(myApp); var idMyApp=myApp.Id; _session.Flush(); _session.Clear(); _session=NHibernateHelper.CreateSession(); var a=_session.Load(idMyApp); 在我尝试从数据库加载回对象时遇到的异常是:

Test method HNI.Portal.Test.MappingTests.RoleMap.CanCorrectMapRole threw exception: NHibernate.ObjectNotFoundException: No row with the given identifier exists[HNI.Portal.Core.Entities.Application#1]. 测试方法HNI.Portal.Test.MappingTests.RoleMap.CanCorrectMapRole引发异常:NHibernate.ObjectNotFoundException:不存在具有给定标识符的行[HNI.Portal.Core.Entities.Application#1]。 以及StackTrace:

NHibernate.Impl.SessionFactoryImpl.DefaultEntityNotFoundDelegate.HandleEntityNotFound(String entityName, Object id) NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) NHibernate.Impl.SessionImpl.Load(String entityName, Object id) NHibernate.Impl.SessionImpl.Load(Type entityClass, Object id) NHibernate.Impl.SessionImpl.Load[T](Object id) NHibernate.Impl.SessionFactoryImpl.DefaultEntityNotFoundDelegate.HandleEntityNotFound(字符串entityName,对象id) NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent事件、IEntityPersister持久化程序、EntityKey keyToLoad、LoadType选项) NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent事件、IEntityPersister持久化程序、EntityKey keyToLoad、LoadType选项) NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent事件,LoadType LoadType) NHibernate.Impl.SessionImpl.FireLoad(LoadEvent事件,LoadType LoadType) NHibernate.Impl.SessionImpl.Load(字符串entityName,对象id) NHibernate.Impl.SessionImpl.Load(类型entityClass,对象id) NHibernate.Impl.SessionImpl.Load[T](对象id) 我不确定是否应该调用Flush()和Clear()(仍在对其进行研究),但我在使用PersistenceSpecification编写测试时遇到了这个错误。这就是PersistenceSpecification如何在CheckList()断言中验证列表是否正确保存的方法,这对我来说是不合适的。我进入密码,找到了这个复制品

应用程序行已正确插入数据库,但不会再次加载。SqlServer和Sqlite都会发生这种情况

希望你们能帮助我


非常感谢

您正在设置id,但它是一个标识。您不应该设置它,SQL会为您设置它

不要创建新会话,而是使用相同的会话,并使用Get而不是Load进行检索

关于Load和Get之间的差异:

您是否使用两种不同的方式创建会话

NHibernateHelper.CreateSession();


也许你应该试试_sessionFactory.OpenSession();获取用于检索的会话。

您不需要手动刷新,因为框架会注意到您对仍有待定更改的实体执行搜索,这些更改将在获取之前刷新,在这种情况下,我认为idMyApp将是1,而不是从数据库中正确生成的id…导致get代码失败…

我认为您过早地从
myApp
中获取
id
。在查找
Id
之前,请尝试执行
\u session.Flush()
。因为您使用的是标识生成器,所以NHibernate会将生成的Id冒泡回您的对象,但直到刷新会话(通常在事务提交时)才会发生这种情况。

这很奇怪。它保存了对象(就像以前一样),然后在我尝试加载它时给了我一个“row not found”异常。重要的一点是,我可以按照您所说的做,并向这个应用程序实体的父级添加Cascade,从而使断言工作。我将做更多的测试以确保一切正常。+1关于标识id.-1关于会话.Clear(),因为在测试时清除会话是有意义的,以确保您点击的是db而不是cache.pedro,我有.Clear()在我的示例中,因为PersistenceSpecification.VerifyTheMappings使用它,所以我需要它来重新处理问题。@Pedro:创建新会话会断言Load()方法命中数据库。使用相同的会话,NHibernate可以返回缓存的实体。无论如何,建议只在一个且唯一的上下文(WinForm或网页)中使用同一会话。在这个上下文不再可行之后,应该释放会话,以支持另一个新的会话。长时间使用同一会话会导致ISession接口内存泄漏,因为它会跟踪被操纵的实体。@Will:Clear将从会话缓存中完全逐出所有对象。如果您确实设置了它,它仍然可以从二级缓存中检索,但是考虑到这是一个测试,您不认为清除就足够了吗?\u sessionFactory在NHibernateHelper中是静态的,因此他们使用相同的工厂来创建会话。您是否对代码进行了断点设置以查看
_sessionFactory.OpenSession();