Nhibernate错误:System.Data.SqlClient.SqlException:靠近'的语法不正确;指数';

Nhibernate错误:System.Data.SqlClient.SqlException:靠近'的语法不正确;指数';,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个nhibernate解决方案,我正在尝试进行保存,但出现以下错误: Test method HelloMusic.Core.Test.CrudTests.TestTrackAdd threw exception: NHibernate.Exceptions.GenericADOException: could not insert collection: [HelloMusic.BLL.Track.Credits#20][SQL: INSERT INTO Tracks_Credits

我有一个nhibernate解决方案,我正在尝试进行保存,但出现以下错误:

Test method HelloMusic.Core.Test.CrudTests.TestTrackAdd threw exception: 
NHibernate.Exceptions.GenericADOException: could not insert collection: [HelloMusic.BLL.Track.Credits#20][SQL: INSERT INTO Tracks_Credits (TrackID, Index, CreditID) VALUES (@p0, @p1, @p2)] ---> System.Data.SqlClient.SqlException: Incorrect syntax near 'Index'. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. See SQL Server Books Online for proper syntax.
SQL语句如下所示:

NHibernate: SELECT this_.GenreID as GenreID9_0_, this_.GenreName as GenreName9_0_ FROM Genres this_
NHibernate: INSERT INTO Tracks (ContainsSamples, Description, HasExplicitLyrics, IsCover, Lyrics, Name, OrderIndex, GenreID) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7); select SCOPE_IDENTITY();@p0 = False, @p1 = 'Teh awesome18133437', @p2 = True, @p3 = False, @p4 = 'b'z in yer mouth18141375', @p5 = 'beez in yer mouth18141375', @p6 = 1, @p7 = 1
NHibernate: INSERT INTO Credits (Email, Location, Name, Role) VALUES (@p0, @p1, @p2, @p3); select SCOPE_IDENTITY();@p0 = 'foo@foo.com', @p1 = NULL, @p2 = 'Some Dood', @p3 = 'teh Awesums'
NHibernate: INSERT INTO Images (ForeignEntityID, ForeignEntityType, CreatedDate, Extension, FileName, Height, IsOriginal, LastModifiedDate, LocationPath, MetaData, SizeInKiloBytes, Type, Width) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12); select SCOPE_IDENTITY();@p0 = 0, @p1 = 'Track', @p2 = 7/21/2010 5:20:59 PM, @p3 = 'jpregg', @p4 = 'tex0r', @p5 = 0, @p6 = True, @p7 = 7/21/2010 5:21:00 PM, @p8 = '//server/yourmom', @p9 = NULL, @p10 = 5898, @p11 = NULL, @p12 = 0
NHibernate: INSERT INTO Languages (Name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = 'Spanglish'
NHibernate: INSERT INTO Tracks_Credits (TrackID, Index, CreditID) VALUES (@p0, @p1, @p2);@p0 = 20, @p1 = 0, @p2 = 19
我怀疑问题是这样的(我在SQL中运行了它,得到了相同的错误):

但让我想到的是,这个表没有“索引”列

我的地图上也没有“索引”。有人见过这个吗

为什么要把“索引”放进去

这是信用地图:

public class CreditMap: ClassMap<Credit>
{
    public CreditMap()
    {
        Table("Credits");
        Id(x => x.ID, "CreditId");
        Map(x => x.Email, "Email")
            .Length(1000);
        Map(x => x.Location, "Location")
            .Length(1000);
        Map(x => x.Name, "Name")
            .Length(1000);
        Map(x => x.Role, "Role")
            .Length(1000);
    }
}
public class CreditMap:ClassMap
{
公共信用地图()
{
表(“学分”);
Id(x=>x.Id,“CreditId”);
地图(x=>x.电子邮件,“电子邮件”)
.长度(1000);
地图(x=>x.位置,“位置”)
.长度(1000);
映射(x=>x.Name,“Name”)
.长度(1000);
映射(x=>x.角色,“角色”)
.长度(1000);
}
}
这是轨迹图:

public class ForeignEntityTypeFilter : FilterDefinition
{
    public ForeignEntityTypeFilter()
    {
        WithName("ForeignEntity")
            .AddParameter("IsType", NHibernate.NHibernateUtil.String);
    }
}

public class TrackMap: ClassMap<Track>
{
    public TrackMap()
    {
        Table("Tracks");
        Id(x => x.ID, "TrackId");
        Map(x => x.ContainsSamples);
        Map(x => x.Description);
        Map(x => x.HasExplicitLyrics);
        Map(x => x.IsCover);
        Map(x => x.Lyrics);
        Map(x => x.Name)
            .Length(1000);
        Map(x => x.OrderIndex);
        References<Genre>(x => x.Genre, "GenreID");
        HasManyToMany<Credit>(x => x.Credits)
            .ChildKeyColumn("CreditID")
            .AsList()
            .ParentKeyColumn("TrackID")
            .Table("Tracks_Credits")
            .Not.Inverse()
            .Cascade.SaveUpdate();
        HasMany<TrackImage>(x => x.Images)
            .Table("Images")
            .KeyColumn("ForeignEntityID")
            .ApplyFilter<ForeignEntityTypeFilter>("'Track' == ForeignEntityType")
            .Not.Inverse()
            .Cascade.SaveUpdate();
        HasManyToMany<Language>(x => x.Languages)
            .ChildKeyColumn("LanguageID")
            .AsList()
            .ParentKeyColumn("TrackID")
            .Table("Tracks_Languages")
            .Not.Inverse()
            .Cascade.SaveUpdate();
        HasManyToMany<MediaFile>(x => x.MediaFiles)
            .ChildKeyColumn("MediaFileID")
            .AsList()
            .ParentKeyColumn("TrackID")
            .Table("Tracks_MediaFiles")
            .Not.Inverse()
            .Cascade.SaveUpdate();
    }
}
公共类ForeignEntityTypeFilter:FilterDefinition
{
public ForeignEntityTypeFilter()
{
WithName(“外国实体”)
.AddParameter(“IsType”,NHibernate.NHibernateUtil.String);
}
}
公共类TrackMap:ClassMap
{
公共轨迹图()
{
表(“轨道”);
Id(x=>x.Id,“TrackId”);
映射(x=>x.ContainsSamples);
映射(x=>x.Description);
Map(x=>x.hasplicitlyrics);
Map(x=>x.IsCover);
Map(x=>x.0);
映射(x=>x.Name)
.长度(1000);
Map(x=>x.OrderIndex);
参考文献(x=>x.体裁,“GenreID”);
HasManyToMany(x=>x.Credits)
.ChildKeyColumn(“CreditID”)
.AsList()
.ParentKeyColumn(“TrackID”)
.Table(“轨道积分”)
.Not.Inverse()
.Cascade.SaveUpdate();
有许多(x=>x.Images)
.表格(“图像”)
.KeyColumn(“ForeignEntityID”)
.ApplyFilter(“'Track'==ForeignEntityType”)
.Not.Inverse()
.Cascade.SaveUpdate();
HasManyToMany(x=>x.Languages)
.ChildKeyColumn(“LanguageID”)
.AsList()
.ParentKeyColumn(“TrackID”)
.Table(“轨道语言”)
.Not.Inverse()
.Cascade.SaveUpdate();
HasManyToMany(x=>x.media文件)
.ChildKeyColumn(“MediaFileID”)
.AsList()
.ParentKeyColumn(“TrackID”)
.Table(“跟踪媒体文件”)
.Not.Inverse()
.Cascade.SaveUpdate();
}
}

问题在于集合的
AsList()
映射。这将集合映射为一个有序列表,该列表需要数据库中的索引列来维护顺序。您可能希望使用
AsBag()

映射它们。如果您正在使用自动映射,并且已经执行覆盖以创建多对多关系,则需要添加以设置列的索引名称,例如:

public class ManytoManyConvention: IHasManyToManyConvetion
{
   public void Apply(IManyToManyCollectionInstance instance)
   {
      instance.Index.Column("Index1");
   }
}
这将创建如下表:

create table Table1ToTable2 (
       Table1_id INT not null,
       Table2_id INT not null,
       Index1 INT not null,
       primary key (Table1_id, Index1)
    )

你能为你的学分发布地图和课程吗?还有调用save()之前使用的代码。添加轨迹和信用卡映射。没有轨迹图,因为它只是一个hasmanytomany如果我使用AsBag,我还可以在实体上使用IList吗?@bryan:可以……一个集合就是IList不适用的集合。
create table Table1ToTable2 (
       Table1_id INT not null,
       Table2_id INT not null,
       Index1 INT not null,
       primary key (Table1_id, Index1)
    )