2010-07-22 36 views
7

tôi có một giải pháp nhibernate và tôi đang cố gắng để làm một tiết kiệm, nhưng tôi nhận được lỗi này:Lỗi với Nhibernate: System.Data.SqlClient.SqlException: cú pháp sai gần '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. 

SQL như sau:

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 

tôi nghi ngờ dòng vấn đề là thế này (tôi đã chạy nó trong SQL và nhận được lỗi tương tự):

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

nhưng những gì ném tôi ở đây là bảng không có cột "Chỉ mục"

không có "Chỉ mục" ở bất kỳ đâu trong bản đồ của tôi. có ai thấy điều này không?

tại sao nó ném 'chỉ mục' trong đó?

đây là bản đồ tín dụng:

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

và đây là bản đồ theo dõi:

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

Bạn có thể đăng ánh xạ và lớp học cho Tracks_Credits không? Cũng là mã mà bạn đã sử dụng trước khi gọi hàm save(). –

+0

Thêm Bản đồ và Bản đồ tín dụng. không có bản đồ Tracks_Credits vì nó chỉ là một HasManyToMany –

Trả lời

14

Vấn đề là AsList() ánh xạ cho các bộ sưu tập. Điều này ánh xạ bộ sưu tập dưới dạng danh sách có thứ tự yêu cầu cột chỉ mục trong cơ sở dữ liệu để duy trì thứ tự. Bạn có thể muốn ánh xạ chúng bằng cách sử dụng AsBag().

+1

Nếu tôi làm AsBag, tôi có thể vẫn sử dụng IList trên thực thể không? –

+1

@bryan: vâng, bạn có thể ... một bộ là bộ sưu tập mà IList không thể áp dụng. – DanP

0

Nếu bạn đang sử dụng automapping và đã làm một override để tạo ra một mối quan hệ nhiều-nhiều, bạn cần phải thêm để thiết lập tên index cho cột, ví dụ:

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

này tạo ra một bảng như sau:

create table Table1ToTable2 (
     Table1_id INT not null, 
     Table2_id INT not null, 
     Index1 INT not null, 
     primary key (Table1_id, Index1) 
    ) 
Các vấn đề liên quan