J'utilise Fluent NHibernate pour créer un projet ASP.NET MVC, avec des Soumissions et des Votes (Up/Down) par les Utilisateurs.(Couramment) Problème d'ID composite NHibernate: MySQL se plaint que l'index des paramètres est hors limites
Bien sûr, les utilisateurs peuvent voter à la hausse ou à la baisse. Pour enregistrer, je créé une table du milieu, SubmissionVote, qui contiennent les champs suivants:
submissionId (int)
userId (int)
score (enum: up/down)
Voici mes applications:
Soumission
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");
utilisateur
Id(x => x.Id);
...
HasMany(x => x.Submission).Inverse().KeyColumn("userID").Cascade.All();
HasMany(x => x.SubmissionVotes).KeyColumn("userID").Cascade.All().Table("SubmissionVote");
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");
Depuis la table du milieu dans mon DB a un champ de partition, j'ai créé la classe SubmissionVote le représenter. Les champs d'utilisateur et de soumission de cette classe sont des relations plusieurs-à-un avec leurs classes respectives.
Le problème est le suivant: la classe SubmissionVote doit posséder une propriété ID, sinon NHibernate génère une erreur. Cela ne devrait pas être le cas, puisque l'ID d'une SubmissionVote est un ID composite, comme représenté dans le mappage. Je peux vivre avec, mais cela cause un autre problème. Lorsque j'essaie d'enregistrer une soumission avec quelques SubmissionVotes, en utilisant session.SaveOrUpdate (soumission), j'obtiens cette erreur une exception ArrayOutOfBounds lancée par MySQL, comme dans cette question: How can I use a composite-id with a class as the id field in fluent nhibernate?. En regardant les journaux NHibernate, je peux voir la requête qui est envoyée à 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
Apparemment, NHibernate essaie d'inclure une valeur "ID" par défaut ('0') à la requête (probablement la propriété ID j'ai ajouté à la SubmissionVote).
Les deux problèmes sont-ils liés? Comment puis-je résoudre ce problème?
Merci beaucoup!
Modifier
Voici mon (partiel, mais relevent) schéma produit par 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)
Par souci de clarté, u peut afficher le schéma généré ?. TextWriter writer = nouveau StreamWriter (Path.GetTempPath() + "nh.sql"); new SchemaExport (configuration) .Exécute (true, false, false, session.Connection, writer); devrait faire cela – Cherian