提交时索引超出范围(Fluent NHibernate)
Index out of range when committing (Fluent NHibernate)
已解决
原来是我的外键弄乱了我。一旦我删除它们,它就像一个魅力。奇怪...
我是 Fluent NHibernate 神奇世界的新手,我 运行 遇到了一些麻烦。我的数据库中有两个相关的 table。这些是 消息 和 用户 。关系应该是 one 用户可以发送 many 消息并接收 many 消息。
为此,我创建了两张地图。一个用于消息,一个用于用户。我使用 MySQL 作为数据库。
用户
Id(x => x.Id);
Map(x => x.Username).Not.Nullable();
Map(x => x.Password).Not.Nullable();
Map(x => x.Email).Not.Nullable();
Map(x => x.Firstname);
Map(x => x.Surname);
Map(x => x.Salt);
Map(x => x.Privilege);
HasMany(x => x.Messages).KeyColumn("msg_to_userid").ReadOnly();
HasMany(x => x.SentMessages).KeyColumn("msg_from_userid").ReadOnly();
Table("users");
消息
Id(x => x.Id, "msg_id");
Map(x => x.Title, "msg_title");
Map(x => x.ToId, "msg_to_userid").Not.Nullable();
Map(x => x.FromId, "msg_from_userid").Not.Nullable();
Map(x => x.DateTime, "msg_datetime");
Map(x => x.Content, "msg_message");
Map(x => x.Read, "msg_read");
References(x => x.To, "msg_to_userid").ReadOnly();
References(x => x.From, "msg_from_userid").ReadOnly();
Table("messages");
用户table结构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`salt` varchar(255) NOT NULL,
`email` varchar(75) NOT NULL,
`firstname` varchar(45) DEFAULT NULL,
`surname` varchar(45) DEFAULT NULL,
`privilege` tinyint(2) DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
以及消息的结构:
CREATE TABLE `messages` (
`msg_id` int(11) NOT NULL AUTO_INCREMENT,
`msg_title` varchar(100) DEFAULT NULL,
`msg_from_userid` int(11) DEFAULT NULL,
`msg_to_userid` int(11) DEFAULT NULL,
`msg_datetime` datetime DEFAULT NULL,
`msg_message` longtext,
`msg_read` bit(1) DEFAULT b'0',
PRIMARY KEY (`msg_id`),
KEY `fk_messages_users_idx` (`msg_from_userid`),
KEY `fk_msgtouserid_users_idx` (`msg_to_userid`),
CONSTRAINT `fk_msgfromuserid_users` FOREIGN KEY (`msg_from_userid`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
如您所见,我在消息中有两个外键。一种获取发送的用户,一种获取接收的用户。
当我有数据时,我只使用 begin transaction 和 commit()。我觉得奇怪的是我可以 select 并毫无困难地获取数据。例如,我可以看到我的所有消息,但是当我尝试更新或保存新消息时,它会失败。
我收到的错误消息是 IndexOutOfRangeException 类型的消息:参数索引超出范围。
感谢任何帮助,谢谢!
已解决
原来是我的外键弄乱了我。一旦我删除它们,它就起作用了。我认为最好在 NHibernate 中完成映射后添加外键。这样就更容易知道出了什么问题以及哪些键不起作用。
已解决
原来是我的外键弄乱了我。一旦我删除它们,它就像一个魅力。奇怪...
我是 Fluent NHibernate 神奇世界的新手,我 运行 遇到了一些麻烦。我的数据库中有两个相关的 table。这些是 消息 和 用户 。关系应该是 one 用户可以发送 many 消息并接收 many 消息。
为此,我创建了两张地图。一个用于消息,一个用于用户。我使用 MySQL 作为数据库。
用户
Id(x => x.Id);
Map(x => x.Username).Not.Nullable();
Map(x => x.Password).Not.Nullable();
Map(x => x.Email).Not.Nullable();
Map(x => x.Firstname);
Map(x => x.Surname);
Map(x => x.Salt);
Map(x => x.Privilege);
HasMany(x => x.Messages).KeyColumn("msg_to_userid").ReadOnly();
HasMany(x => x.SentMessages).KeyColumn("msg_from_userid").ReadOnly();
Table("users");
消息
Id(x => x.Id, "msg_id");
Map(x => x.Title, "msg_title");
Map(x => x.ToId, "msg_to_userid").Not.Nullable();
Map(x => x.FromId, "msg_from_userid").Not.Nullable();
Map(x => x.DateTime, "msg_datetime");
Map(x => x.Content, "msg_message");
Map(x => x.Read, "msg_read");
References(x => x.To, "msg_to_userid").ReadOnly();
References(x => x.From, "msg_from_userid").ReadOnly();
Table("messages");
用户table结构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`salt` varchar(255) NOT NULL,
`email` varchar(75) NOT NULL,
`firstname` varchar(45) DEFAULT NULL,
`surname` varchar(45) DEFAULT NULL,
`privilege` tinyint(2) DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
以及消息的结构:
CREATE TABLE `messages` (
`msg_id` int(11) NOT NULL AUTO_INCREMENT,
`msg_title` varchar(100) DEFAULT NULL,
`msg_from_userid` int(11) DEFAULT NULL,
`msg_to_userid` int(11) DEFAULT NULL,
`msg_datetime` datetime DEFAULT NULL,
`msg_message` longtext,
`msg_read` bit(1) DEFAULT b'0',
PRIMARY KEY (`msg_id`),
KEY `fk_messages_users_idx` (`msg_from_userid`),
KEY `fk_msgtouserid_users_idx` (`msg_to_userid`),
CONSTRAINT `fk_msgfromuserid_users` FOREIGN KEY (`msg_from_userid`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
如您所见,我在消息中有两个外键。一种获取发送的用户,一种获取接收的用户。
当我有数据时,我只使用 begin transaction 和 commit()。我觉得奇怪的是我可以 select 并毫无困难地获取数据。例如,我可以看到我的所有消息,但是当我尝试更新或保存新消息时,它会失败。
我收到的错误消息是 IndexOutOfRangeException 类型的消息:参数索引超出范围。 感谢任何帮助,谢谢!
已解决
原来是我的外键弄乱了我。一旦我删除它们,它就起作用了。我认为最好在 NHibernate 中完成映射后添加外键。这样就更容易知道出了什么问题以及哪些键不起作用。