2 a839398 a839398 于 2018.01.12 17:27 提问

NHibernate没法把对象存进数据库的表,该表有一个外键

我是一个初学者。
NHibernate没法把对象存进数据库的role表,也取不出数据,该表有一个外键关联到user表。我认为是这个表外键导致存不进去的。因为我另一部分程序顺利地访问了我的数据库的user表。以下是存进数据库的程序代码和报的错
public class RoleManager
{
public void AddRole(Role role)
{
using (var session = NHibernateHelper.getSession())
{
using (var transaction = session.BeginTransaction())
{
session.Save(role);//报错
transaction.Commit();
}
}

}
class RoleMap:ClassMap
{
public RoleMap()
{
Id(x => x.Id).Column("Id");//主键
Map(x => x.Name).Column("name");
Map(x => x.Level).Column("level");
Map(x => x.IsMan).Column("isman");
Map(x => x.RolePrefabName).Column("roleprefabname");
References(x => x.User).Column("userid");//外键
Table("role");
}
}
public class Role
{
public virtual int Id { set; get; }//主键
public virtual string Name{ set; get; }
public virtual int Level { set; get; }
public virtual bool IsMan { set; get; }
public virtual string RolePrefabName { set; get; }
public virtual Users User { set; get; }//外键
}
报错信息
2018-01-11 17:35:27,710 [10] INFO BaiLaoDaServer.BaiLaoDaPeer [(null)] - handler from operation code is isExit:1
2018-01-11 17:35:46,440 [10] INFO BaiLaoDaServer.BaiLaoDaPeer [(null)] - handler from operation code is isExit:0
2018-01-11 17:35:46,450 [10] INFO BaiLaoDaServer.Handlers.LoginHandler [(null)] - BaiLaoDaPeer.user=11ytbai
2018-01-11 17:35:46,480 [6] INFO BaiLaoDaServer.BaiLaoDaPeer [(null)] - handler from operation code is isExit:3
2018-01-11 17:35:46,480 [6] ERROR Photon.SocketServer.PeerBase [(null)] - NHibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing or set cascade action for the property to something that would make it autosave. Type: BaiLaoDaCommon.Model.Users, Entity: BaiLaoDaCommon.Model.Users
在 NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName, Object entity, ISessionImplementor session)
在 NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand cmd, Object value, Int32 index, ISessionImplementor session)
在 NHibernate.Param.CriteriaNamedParameterSpecification.Bind(IDbCommand command, IList1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor session)
在 NHibernate.Param.CriteriaNamedParameterSpecification.Bind(IDbCommand command, IList`1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor session)
在 NHibernate.SqlCommand.SqlCommandImpl.Bind(IDbCommand command, ISessionImplementor session)
在 NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, Boolean scroll, ISessionImplementor session)
在 NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
在 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
在 NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer)
在 NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
在 NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
在 NHibernate.Impl.CriteriaImpl.List(IList results)
在 NHibernate.Impl.CriteriaImpl.ListT
在 BaiLaoDaServer.DB.Managers.RoleManager.GetRolesByUser(Users user) 位置 D:\PhontonServerWorkspace\BaiLaoDaServer\BaiLaoDaServer\DB\Managers\RoleManager.cs:行号 23
在 BaiLaoDaServer.Handlers.RoleHandler.OnHandlerMessage(OperationRequest request, BaiLaoDaPeer peer) 位置 D:\PhontonServerWorkspace\BaiLaoDaServer\BaiLaoDaServer\Handlers\RoleHandler.cs:行号 34
在 BaiLaoDaServer.BaiLaoDaPeer.OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters) 位置 D:\PhontonServerWorkspace\BaiLaoDaServer\BaiLaoDaServer\BaiLaoDaPeer.cs:行号 39
在 Photon.SocketServer.PeerBase.OnReceive(Byte[] data, SendParameters sendParameters) 位置 h:\svncontent\photon-socketserver-sdk_3.4\src\Photon.SocketServer\PeerBase.cs:行号 963
在 Photon.SocketServer.PeerBase.OnReceiveInternal(Byte[] data, SendParameters sendParameters, Int32 rtt, Int32 rttVariance, Int32 numFailures) 位置 h:\svncontent\photon-socketserver-sdk_3.4\src\Photon.SocketServer\PeerBase.cs:行号 749
2018-01-11 17:36:14,502 [16] INFO BaiLaoDaServer.BaiLaoDaPeer [(null)] - handler from operation code is isExit:3
2018-01-11 17:36:14,506 [16] INFO BaiLaoDaServer.DB.Managers.RoleManager [(null)] - sdfg/1/0/girl_stand/11ytbai
2018-01-11 17:36:14,514 [16] ERROR Photon.SocketServer.PeerBase [(null)] - NHibernate.Exceptions.GenericADOException: could not insert: [BaiLaoDaCommon.Model.Role][SQL: INSERT INTO role (name, level, isman, roleprefabname, userid) VALUES (?, ?, ?, ?, ?)] ---> MySql.Data.MySqlClient.MySqlException: Column 'userid' cannot be null
在 MySql.Data.MySqlClient.MySqlStream.ReadPacket()
在 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
在 MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
在 MySql.Data.MySqlClient.MySqlDataReader.NextResult()
在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
在 NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)
在 NHibernate.Id.Insert.AbstractSelectingDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder)
--- 内部异常堆栈跟踪的结尾 ---
在 NHibernate.Id.Insert.AbstractSelectingDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder)
在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session)
在 NHibernate.Action.EntityIdentityInsertAction.Execute()
在 NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
在 NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
在 NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
在 NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
在 NHibernate.Impl.SessionImpl.Save(Object obj)
在 BaiLaoDaServer.DB.Managers.RoleManager.AddRole(Role role) 位置 D:\PhontonServerWorkspace\BaiLaoDaServer\BaiLaoDaServer\DB\Managers\RoleManager.cs:行号 35
在 BaiLaoDaServer.Handlers.RoleHandler.OnHandlerMessage(OperationRequest request, BaiLaoDaPeer peer) 位置 D:\PhontonServerWorkspace\BaiLaoDaServer\BaiLaoDaServer\Handlers\RoleHandler.cs:行号 44
在 BaiLaoDaServer.BaiLaoDaPeer.OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters) 位置 D:\PhontonServerWorkspace\BaiLaoDaServer\BaiLaoDaServer\BaiLaoDaPeer.cs:行号 39
在 Photon.SocketServer.PeerBase.OnReceive(Byte[] data, SendParameters sendParameters) 位置 h:\svncontent\photon-socketserver-sdk_3.4\src\Photon.SocketServer\PeerBase.cs:行号 963
在 Photon.SocketServer.PeerBase.OnReceiveInternal(Byte[] data, SendParameters sendParameters, Int32 rtt, Int32 rttVariance, Int32 numFailures) 位置 h:\svncontent\photon-socketserver-sdk_3.4\src\Photon.SocketServer\PeerBase.cs:行号 749

7个回答

caozhy
caozhy   Ds   Rxr 2018.01.12 18:20
已采纳

session.Save(role);
这里调试下role的id字段是不是没有赋值?

MySql.Data.MySqlClient.MySqlException: Column 'userid' cannot be null 提示userid为空。

a839398
a839398   2018.01.13 17:37

role.User不空也不行。各位大神,有经验的分享一下,或者给点NHibernate的资料也可以的。我是一个初学者,没什么经验。

a839398
a839398   2018.01.13 17:40

我是看别人的视频学的,碰到这个问题。人家视频就没问题。我抄人家的程序也不行。

a839398
a839398   2018.01.14 17:49

我找到原因了。我存进数据库的User没问题,user的Id是自增长的。但是我查询和保存的时候用的user没设置Id。

a839398
a839398   2018.01.12 18:03

可不可以帮我改一下这个函数public void AddRole(Role role),我传一个完整的role进来,存进数据库

a839398
a839398   2018.01.12 17:49

取出来的时候也报错了。
存进去的时候那个role.User是清空的。

a839398
a839398   2018.01.12 17:55

时间在2018-01-11 17:35:46,480到2018-01-11 17:36:14,502 之间是查询数据报的错,而2018-01-11 17:36:14,502 之后的是存进数据报的错

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!