#fluent-nhibernate #nhibernate-mapping #fluent
#свободно-nhibernate #nhibernate-отображение #беглый
Вопрос:
Я получаю следующую ошибку:
Недопустимый индекс 3 для этой коллекции OracleParameterCollection с Count = 3
когда я пытаюсь вставить новый столбец в таблицу.
мой класс сущности — это:
public class Operator
{
public Operator()
{
this.OperatorMemberships = new List<OperatorMembership>();
}
public virtual int Id { get; set; }
public virtual int OperatorMembershipId { get; set; }
public virtual int SchemeId { get; set; }
public virtual string Description { get; set; }
public virtual IList<OperatorMembership> OperatorMemberships { get; set; }
}
public class OperatorMembership
{
public virtual int Id { get; set; }
public virtual int OperatorId { get; set; } // delete
public virtual int UserRoleId { get; set; } // delete
public virtual UserRole UserRole { get; set; }
public virtual Operator Operator { get; set; }
}
Мои сопоставления:
public OperatorMap()
{
Table("OPERATOR");
Id(x => x.Id, "OPERATOR_ID").GeneratedBy.Identity();
Map(x => x.SchemeId, "SCHEME_ID");
Map(x => x.Description, "DESCRIPTION");
//HasMany(x => x.OperatorMemberships).Inverse().AsBag().Cascade.AllDeleteOrphan();
HasMany(x => x.OperatorMemberships).Inverse().AsBag();
//References(x => x.SchemeServices, "OPERATOR_ID");
}
}
public class OperatorMembershipMap : ClassMap<OperatorMembership>
{
public OperatorMembershipMap()
{
Table("USER_OPERATOR_MEMBERSHIP");
Id(x => x.Id, "USER_OPERATOR_MEMBERSHIP_ID").GeneratedBy.Identity();
Map(x => x.OperatorId, "OPERATOR_ID");
Map(x => x.UserRoleId, "USER_ROLE_ID");
References(x => x.Operator).Column("OPERATOR_ID"); ;
References(x => x.UserRole).Column("USER_ROLE_ID");
}
}
код для вставки новой строки является:
public int AddOperatorMembership(int operatorId, int userRoleId)
{
OperatorMembership op = new OperatorMembership();
op.OperatorId = operatorId;
op.UserRoleId = userRoleId;
_provider.AddEntity(op);
return op.Id;
}
и моя таблица базы данных:
USER_OPERATOR_MEMBERSHIP_ID -- OPERATOR_ID -- USER_ROLE_ID
любая помощь была бы полезна, я уверен, что есть несколько очень умных разработчиков fluent nhibernate, которые могут сразу обнаружить ошибку.
большое спасибо.
Рэндольф.
Ответ №1:
Вы сопоставляете объекты, на которые даны ссылки, И внешний ключ :
public OperatorMembershipMap()
{
Table("USER_OPERATOR_MEMBERSHIP");
Id(x => x.Id, "USER_OPERATOR_MEMBERSHIP_ID").GeneratedBy.Identity();
// Map(x => x.OperatorId, "OPERATOR_ID");
// Map(x => x.UserRoleId, "USER_ROLE_ID");
References(x => x.Operator).Column("OPERATOR_ID"); ;
References(x => x.UserRole).Column("USER_ROLE_ID");
}
Вы также можете удалить внешние ключи из своего объекта :
public class OperatorMembership
{
public virtual int Id { get; set; }
// public virtual int OperatorId { get; set; } // delete
// public virtual int UserRoleId { get; set; } // delete
public virtual UserRole UserRole { get; set; }
public virtual Operator Operator { get; set; }
}
Комментарии:
1. если я удалю свойства, я не смогу получить к ним доступ с помощью своего кода для обновления с этими значениями: op.OperatorId = operatorId; op.UserRoleId = userRoleId;
2. И вы можете использовать op. Оператор = сеанс. Загрузка (operatorId)
3. привет, Матье, как бы мне сохранить новую строку operatormembership? если у меня нет двух свойств, то я не смогу сохранить, таблица operatormembership — это таблица поиска для operator и userrole.
4. Вам не нужно сопоставлять таблицу отношений: codeproject.com/KB/database/Nhibernate_Made_Simple.aspx
5. Приветствую, приятель, ты был прав, мне просто не нужно было сопоставлять столбцы, но я все равно оставил их в сущности класса, и это сработало.
Ответ №2:
Я тоже столкнулся с той же проблемой и в итоге полдня искал в Google, но безуспешно. Приведенный выше ответ, данный Матье, показался мне уместным, и я попробовал то же самое, но у меня не сработало. Затем я попробовал удалить ссылки и сохранить свойства без изменений, у меня это сработало, и, надеюсь, сработает и у вас.
Table("USER_OPERATOR_MEMBERSHIP");
Id(x => x.Id, "USER_OPERATOR_MEMBERSHIP_ID").GeneratedBy.Identity();
Map(x => x.OperatorId, "OPERATOR_ID");
Map(x => x.UserRoleId, "USER_ROLE_ID");
//References(x => x.Operator).Column("OPERATOR_ID"); ;
//References(x => x.UserRole).Column("USER_ROLE_ID");
Удалите то же самое и из класса
public class OperatorMembership
{
public virtual int Id { get; set; }
public virtual int OperatorId { get; set; } // delete
public virtual int UserRoleId { get; set; } // delete
//public virtual UserRole UserRole { get; set; }
//public virtual Operator Operator { get; set; }
}