2015-07-23 3 views
1

решаемыеиндекс вне диапазона при совершении (свободный NHibernate)

Оказывается, это были мои внешние ключи Мессинг со мной. Как только я удалил их, он работал как шарм. Weird ...

Я новичок в волшебном мире 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 и commit(). То, что я нахожу странным, заключается в том, что я могу выбирать и извлекать данные без каких-либо проблем. Например, я могу видеть все мои сообщения, но когда я пытаюсь обновить или сохранить новый, он терпит неудачу.

Сообщение об ошибке, которое я получаю, имеет тип IndexOutOfRangeException с сообщением: Индекс параметров за пределами допустимого диапазона. Любая помощь приветствуется, спасибо!

ответ

1

решаемые

Оказывается, это были мои внешние ключи Мессинг со мной. Как только я удалил их, он сработал. Я предполагаю, что лучше всего добавить ключи foregin после того, как отображение выполнено в NHibernate. Тогда легче узнать, что пошло не так, и какие ключи не работают.

Смежные вопросы