1

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");

DB の中央のテーブルにはスコア フィールドがあるため、それを表す SubmissionVote クラスを作成しました。そのクラスのユーザー フィールドと送信フィールドは、それぞれのクラスとの多対 1 の関係です。

問題はこれです: SubmissionVote クラスには ID プロパティが必要です。そうしないと、NHibernate がエラーを生成します。マッピングで表されるように、SubmissionVote の ID は複合 ID であるため、そうではありません。

私は一緒に暮らすことができますが、それは別の問題を引き起こします. session.SaveOrUpdate(submission) を使用して、いくつかの SubmissionVotes を含む送信を保存しようとすると、次の質問のように、MySQL によってスローされた ArrayOutOfBounds 例外というエラーが発生します。流暢な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 プロパティ)。

2つの問題は関連していますか?どうすればこの問題を解決できますか?

どうもありがとうございました!

編集

これは、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)
4

1 に答える 1

3

解決策を見つけました!実際には、composite-id がたまたま私の参照でもあることを NHibernate に指定する必要がありました。

新しいマッピングは次のようになります。

Map(x => x.Vote).Column("score");
CompositeId().KeyReference(x => x.Submission, "submissionID").KeyReference(x => x.User, "userID");
于 2010-01-11T23:17:11.087 に答える