提交时指数超出范围(Fluent NHibernate)

时间:2015-07-23 06:52:24

标签: c# mysql asp.net-mvc nhibernate fluent-nhibernate

解决

原来是我的外键搞砸了我。一旦我删除它,它就像一个魅力。奇怪的...

我是Fluent NHibernate的神奇世界的新手,我遇到了一些麻烦。我的数据库中有两个相关的表。这些是消息用户。关系应该是一个用户可以发送多个消息并收到许多消息。 为此,我创建了两张地图。一个用于消息,一个用于用户。我使用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");

用户的表格结构

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()。我觉得奇怪的是我可以毫无困难地选择和获取数据。例如,我可以看到我的所有消息,但是当我尝试更新或保存新消息时,它会失败。

我收到的错误消息类型为 IndexOutOfRangeException ,消息为:参数索引超出范围。 感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

解决

原来是我的外键搞砸了我。一旦我删除它,它工作。我认为最好在NHibernate中完成映射后添加foregin密钥。然后,更容易知道出了什么问题以及哪些键不起作用。