2010-07-22 15 views
7

tengo una solución nhibernate y yo estoy tratando de hacer una salvación, pero yo estoy recibiendo este error:Error con Nhibernate: System.Data.SqlClient.SqlException: Sintaxis incorrecta cerca de 'Índice'

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. 

el SQL es el siguiente:

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 

sospecho que la línea problema es el siguiente (me quede en SQL y sale el mismo error):

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

pero lo que me está arrojando aquí es que la tabla no tiene una columna "Índice"

tampoco hay ningún "Índice" en ninguna parte de mis mapas. ¿Alguien ha visto esto?

¿por qué arroja el 'índice' allí?

aquí es el mapa de crédito:

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

y aquí es el mapa de la pista:

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

¿Se puede publicar el mapeo y la clase para Tracks_Credits? También el código que usaste antes de llamar a guardar(). –

+0

Agregue la ruta y el mapa de crédito. no hay un mapa Tracks_Credits porque es simplemente un HasManyToMany –

Respuesta

14

El problema es que los AsList() asignaciones para las colecciones. Esto correlaciona la colección como una lista ordenada que requiere una columna de índice en la base de datos para mantener el orden. Probablemente desee mapearlos usando AsBag().

+1

Si hago AsBag, ¿puedo seguir usando IList en la entidad? –

+1

@bryan: sí, puede ... un conjunto es la colección a la que IList no es aplicable. – DanP

0

Si está utilizando automapping y ya no un reemplazo para crear una relación de muchos a muchos, es necesario agregar para establecer el nombre de índice para la columna, por ejemplo:

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

Esto crear una tabla como esta:

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