我正在使用 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) 保存包含几个 SubmissionVotes 的提交时,我收到这个错误 MySQL 抛出的 ArrayOutOfBounds 异常,就像在这个问题中一样:我如何使用带有类的复合 ID 作为流利的nhibernate中的id字段?.
查看 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)