2010-07-22 13 views
7

ich habe eine nhibernate Lösung und ich versuche, eine speichern zu tun, aber ich erhalte diese Fehlermeldung:Fehler bei Nhibernate: System.Data.SqlClient.SqlException: falsche Syntax in der Nähe von ‚Index‘

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. 

die SQL ist wie folgt:

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 = '[email protected]', @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 

ich das Problem Linie vermuten, das ist (ich habe es in SQL ausführen und die gleichen Fehler):

NHibernate: INSERT INTO Tracks_Credits (TrackID, Index, CreditID) VALUES (@p0, @p1, @p2);@p0 = 20, @p1 = 0, @p2 = 19 

aber was mich hier wirft ist, dass die Tabelle keine "Index" -Spalte

hat, gibt es auch keinen "Index" irgendwo in meinen Karten. hat das jemand gesehen?

Warum wirft es den 'Index' dort?

hier ist die Kreditkarte:

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

und hier ist die Streckenkarte:

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(); 
    } 
} 
+0

Können Sie das Mapping und die Klasse für Tracks_Credits veröffentlichen? Auch der Code, den Sie vor dem Aufruf von save() verwendet haben. –

+0

Fügen Sie die Spur und die Kreditkarte hinzu. Es gibt keine Karte von Tracks_Credits, weil es nur ein HasManyToMany ist. –

Antwort

14

Das Problem ist die AsList() Zuordnungen für die Sammlungen. Dies ordnet die Sammlung einer sortierten Liste zu, die eine Indexspalte in der Datenbank erfordert, um die Reihenfolge beizubehalten. Wahrscheinlich möchten Sie sie mit AsBag() abbilden.

+1

Wenn ich AsBag mache, kann ich IList weiterhin für die Entität verwenden? –

+1

@bryan: ja du kannst ... ein Set ist die Sammlung, auf die IList nicht anwendbar ist. – DanP

0

Wenn Sie Automapping verwenden und bereits über eine Überschreibung eine many-to-many-Beziehung zu erstellen, müssen Sie die Indexnamen für die Spalte, zum Beispiel zu setzen hinzuzufügen:

public class ManytoManyConvention: IHasManyToManyConvetion 
{ 
    public void Apply(IManyToManyCollectionInstance instance) 
    { 
     instance.Index.Column("Index1"); 
    } 
} 

Dieses erstellen Tabelle wie folgt:

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