(Fluent)NHibernate复合id问题:MySQL抱怨参数索引超出范围

(Fluent)NHibernate复合id问题:MySQL抱怨参数索引超出范围,mysql,fluent-nhibernate,nhibernate-mapping,parameters,composite-id,Mysql,Fluent Nhibernate,Nhibernate Mapping,Parameters,Composite Id,我正在使用Fluent NHibernate创建一个ASP.NET MVC项目,由用户提交和投票(上/下) 当然,用户可以投票赞成或反对提交。为了记录这一点,我创建了一个中间表SubmissionVote,其中包含以下字段: submissionId (int) userId (int) score (enum: up/down) 以下是我的映射: 提交 Id(x => x.Id); ... References(x => x.User).Column("userID").Not.

我正在使用Fluent NHibernate创建一个ASP.NET MVC项目,由用户提交和投票(上/下)

当然,用户可以投票赞成或反对提交。为了记录这一点,我创建了一个中间表SubmissionVote,其中包含以下字段:

submissionId (int)
userId (int)
score (enum: up/down)
以下是我的映射:

提交

Id(x => x.Id);
...
References(x => x.User).Column("userID").Not.LazyLoad();
HasMany(x => x.Votes).Cascade.All().KeyColumn("submissionID").Table("SubmissionVote").Not.LazyLoad();
Table("Submission");
用户

Id(x => x.Id);
...
HasMany(x => x.Submission).Inverse().KeyColumn("userID").Cascade.All();
HasMany(x => x.SubmissionVotes).KeyColumn("userID").Cascade.All().Table("SubmissionVote");
提交投票

Map(x => x.Vote).Column("score");
CompositeId().KeyProperty(x => x.Submission.Id, "submissionID").KeyProperty(x => x.User.Id, "userID");
References(x => x.Submission).Column("submissionID");
References(x => x.User).Column("userID");
因为我数据库中的中间表有一个score字段,所以我创建了SubmissionVote类来表示它。该类中的用户字段和提交字段与其各自的类具有多对一关系

问题在于:SubmissionVote类需要有一个ID属性,否则NHibernate会产生错误。不应该是这样,因为SubmissionVote的ID是一个复合ID,如映射中所示

我可以忍受,但这会引起另一个问题。当我尝试使用session.SaveOrUpdate(submission)保存包含一些submissionvote的提交时,我会在MySQL引发的ArrayOutOfBounds异常中收到此错误,如以下问题:

查看NHibernate日志,我可以看到发送到MySQL的查询

14:53:07.358 [9] DEBUG ... - Building an IDbCommand object for the SqlString: INSERT INTO `SubmissionVote` (score, submissionID, userID) VALUES (?, ?, ?)
14:53:07.361 [9] DEBUG ... - binding 'Up' to parameter: 0
14:53:07.367 [9] DEBUG NHibernate.Type.Int32Type - binding '183' to parameter: 1
14:53:07.367 [9] DEBUG NHibernate.Engine.IdentifierValue - unsaved-value: 0
14:53:07.367 [9] DEBUG NHibernate.Type.Int32Type - binding '2' to parameter: 2
14:53:07.367 [9] DEBUG NHibernate.Type.Int32Type - binding '0' to parameter: 3
显然,NHibernate试图在查询中包含默认的“ID”值(“0”)(可能是我添加到SubmissionVote中的ID属性)

这两个问题相关吗?我怎样才能解决这个问题

多谢各位

编辑

这是我的(部分但相关的)模式,由NHibernate生成

create table submission (
    Id INTEGER NOT NULL AUTO_INCREMENT,
   CreationDate DATETIME,
   BeginDate DATETIME,
   EndDate DATETIME,
   Content VARCHAR(255),
   userID INTEGER,
   primary key (Id)
)

create table User (
Id INTEGER NOT NULL AUTO_INCREMENT,
   UserName VARCHAR(255) unique,
   Password VARCHAR(255),
   Email VARCHAR(255),
   primary key (Id)
)

create table `submissionVote` (
submissionID INTEGER not null,
   userID INTEGER not null,
   score VARCHAR(255),
   primary key (submissionID, userID)
)

alter table `submissionVote` 
    add index (submissionID), 
    add constraint FKC2AE73C56C66D2D5 
foreign key (submissionID) 
references submission (Id)

alter table `submissionVote` 
add index (userID), 
add constraint FKC2AE73C5EC6C1277 
foreign key (userID) 
references User (Id)

alter table submission 
 add index (userID), 
 add constraint FKE6354599EC6C1277 
 foreign key (userID) 
 references User (Id)

我找到了解决办法!实际上,我必须向NHibernate指定复合id也恰好是我的引用

新映射如下所示:

Map(x => x.Vote).Column("score");
CompositeId().KeyReference(x => x.Submission, "submissionID").KeyReference(x => x.User, "userID");

为了清楚起见,你能发布生成的模式吗?。TextWriter writer=newstreamwriter(Path.GetTempPath()+“nh.sql”);新的SchemaExport(配置).Execute(true、false、false、session.Connection、writer);你可以做的是:
Map(x=>x.Vote,“score”)