さて、ここで問題です。m:n を PK の異なる列数でマッピングしたい人ほどクレイジーではありません。
私が何をしても、どこを見ても、これのマッピングを成功させるメソッドチェーンはないようです。
ParentColumn("").ParentColumn("").ChildColumn("").ChildColumn("") など、Parent 列と Child 列を 2 倍にしてみました。
運がないForeignKeyConstraintNamesを使用してみました。それでも、FNH は片側を単一のキーにマッピングしています。
public partial class M2M2ParentAMap : ClassMap<M2M2ParentA>
{
public M2M2ParentAMap()
{
Table("`M2M2ParentA`");
Schema("`dbo`");
CompositeId().KeyProperty( x => x.M2M2ParentAId1, "`M2M2ParentAId1`" ).KeyProperty( x => x.M2M2ParentAId2, "`M2M2ParentAId2`" );
HasManyToMany(x => x.M2M2ParentB).Schema("`dbo`")
.ForeignKeyConstraintNames("FK_M2M2Link_M2M2ParentA", "FK_M2M2Link_M2M2ParentB");
}
}
public partial class M2M2ParentBMap : ClassMap<M2M2ParentB>
{
public M2M2ParentBMap()
{
Table("`M2M2ParentB`");
Schema("`dbo`");
CompositeId().KeyProperty( x => x.M2M2ParentBId1, "`M2M2ParentBId1`" ).KeyProperty( x => x.M2M2ParentBId2, "`M2M2ParentBId2`" );
HasManyToMany(x => x.M2M2ParentA)
.Schema("`dbo`").ForeignKeyConstraintNames("FK_M2M2Link_M2M2ParentB", "FK_M2M2Link_M2M2ParentA");
}
}
public partial class M2M2LinkMap : ClassMap<M2M2Link>
{
public M2M2LinkMap()
{
Table("`M2M2Link`");
Schema("`dbo`");
CompositeId()
.KeyProperty( x => x.M2M2ParentA_Id1, "`M2M2ParentA_Id1`" )
.KeyProperty( x => x.M2M2ParentA_Id2, "`M2M2ParentA_Id2`" )
.KeyProperty( x => x.M2M2ParentB_Id1, "`M2M2ParentB_Id1`" )
.KeyProperty( x => x.M2M2ParentB_Id2, "`M2M2ParentB_Id2`" );
References(x => x.M2M2ParentA).Columns("`M2M2ParentA_Id1`","`M2M2ParentA_Id2`").Cascade.All();
References(x => x.M2M2ParentB).Columns("`M2M2ParentB_Id1`","`M2M2ParentB_Id2`").Cascade.All();
}
}
ERROR:
Foreign key (FK_M2M2Link_M2M2ParentB:M2M2ParentAToM2M2ParentB [M2M2ParentB_id])) must have same number of columns as the referenced primary key (M2M2ParentB [M2M2ParentBId1, M2M2ParentBId2])
と
public partial class M2M2ParentAMap : ClassMap<M2M2ParentA>
{
public M2M2ParentAMap()
{
Table("`M2M2ParentA`");
Schema("`dbo`");
CompositeId()
.KeyProperty( x => x.M2M2ParentAId1, "`M2M2ParentAId1`" )
.KeyProperty( x => x.M2M2ParentAId2, "`M2M2ParentAId2`" );
HasManyToMany(x => x.M2M2ParentB)
.Schema("`dbo`")
.Table("`M2M2Link`")
.ParentKeyColumn("`M2M2ParentA_Id1`")
.ParentKeyColumn("`M2M2ParentA_Id2`")
.ChildKeyColumn("`M2M2ParentB_Id1`")
.ChildKeyColumn("`M2M2ParentB_Id2`");
}
}
public partial class M2M2ParentBMap : ClassMap<M2M2ParentB>
{
public M2M2ParentBMap()
{
Table("`M2M2ParentB`");
Schema("`dbo`");
CompositeId()
.KeyProperty( x => x.M2M2ParentBId1, "`M2M2ParentBId1`" )
.KeyProperty( x => x.M2M2ParentBId2, "`M2M2ParentBId2`" );
HasManyToMany(x => x.M2M2ParentA)
.Schema("`dbo`")
.Table("`M2M2Link`")
.ParentKeyColumn("`M2M2ParentB_Id1`")
.ParentKeyColumn("`M2M2ParentB_Id2`")
.ChildKeyColumn("`M2M2ParentA_Id1`")
.ChildKeyColumn("`M2M2ParentA_Id2`");
}
}
public partial class M2M2LinkMap : ClassMap<M2M2Link>
{
public M2M2LinkMap()
{
Table("`M2M2Link`");
Schema("`dbo`");
CompositeId()
.KeyProperty( x => x.M2M2ParentA_Id1, "`M2M2ParentA_Id1`" )
.KeyProperty( x => x.M2M2ParentA_Id2, "`M2M2ParentA_Id2`" )
.KeyProperty( x => x.M2M2ParentB_Id1, "`M2M2ParentB_Id1`" )
.KeyProperty( x => x.M2M2ParentB_Id2, "`M2M2ParentB_Id2`" );
References(x => x.M2M2ParentA)
.Columns("`M2M2ParentA_Id1`","`M2M2ParentA_Id2`").Cascade.All();
References(x => x.M2M2ParentB)
.Columns("`M2M2ParentB_Id1`","`M2M2ParentB_Id2`").Cascade.All();
}
}
ERROR:
Foreign key (FKAB0E07EA57E45AB6:M2M2Link [M2M2ParentB_Id2])) must have same number of columns as the referenced primary key (M2M2ParentB [M2M2ParentBId1, M2M2ParentBId2])
DDL
CREATE TABLE [dbo].[M2M2ParentA] ( [M2M2ParentAId1] [int] NOT NULL,
[M2M2ParentAId2] [int] NOT NULL,
CONSTRAINT [PK_M2M2ParentA] PRIMARY KEY CLUSTERED ( [M2M2ParentAId1] ASC, [M2M2ParentAId2] ASC ) )
CREATE TABLE [dbo].[M2M2ParentB] ( [M2M2ParentBId1] [int] NOT NULL,
[M2M2ParentBId2] [int] NOT NULL,
CONSTRAINT [PK_M2M2ParentB] PRIMARY KEY CLUSTERED ( [M2M2ParentBId1] ASC, [M2M2ParentBId2] ASC ) )
CREATE TABLE [dbo].[M2M2Link] ( [M2M2ParentA_Id1] [int] NOT NULL,
[M2M2ParentA_Id2] [int] NOT NULL,
[M2M2ParentB_Id1] [int] NOT NULL,
[M2M2ParentB_Id2] [int] NOT NULL,
CONSTRAINT [PK_M2M2Link] PRIMARY KEY CLUSTERED ( [M2M2ParentA_Id1] ASC, [M2M2ParentA_Id2] ASC, [M2M2ParentB_Id1] ASC, [M2M2ParentB_Id2] ASC ) )
ALTER TABLE [dbo].[M2M2Link]
WITH CHECK
ADD CONSTRAINT [FK_M2M2Link_M2M2ParentA] FOREIGN KEY ( [M2M2ParentA_Id1], [M2M2ParentA_Id2] ) REFERENCES [dbo].[M2M2ParentA] ( [M2M2ParentAId1],
[M2M2ParentAId2] )
ALTER TABLE [dbo].[M2M2Link]
CHECK CONSTRAINT [FK_M2M2Link_M2M2ParentA]
ALTER TABLE [dbo].[M2M2Link]
WITH CHECK
ADD CONSTRAINT [FK_M2M2Link_M2M2ParentB] FOREIGN KEY ( [M2M2ParentB_Id1], [M2M2ParentB_Id2] ) REFERENCES [dbo].[M2M2ParentB] ( [M2M2ParentBId1],
[M2M2ParentBId2] )
ALTER TABLE [dbo].[M2M2Link]
CHECK CONSTRAINT [FK_M2M2Link_M2M2ParentB]
更新: カスタム キー タイプを作成しようとしましたが、成功しませんでした。
あなたの挑戦、あなたがそれを受け入れることを選択した場合:
このテーブル構造を使用して、おそらくカスタム キー タイプを使用して、最適に機能する流暢なマッピングのコードを提示してください。賞金はあなたのものです。
誰?