2011-01-17 7 views
0

Ich versuche, DB-Schema mit fließenden Nhibernate, Nhibernate 3.0, spring.net 1.3.1 und SQLite zu generieren. Das Erstellen/Update-Skript von NHibernate erzeugteNhibernate erzeugt einen Fehler in db create Skript

create table LogEntries (Id UNIQUEIDENTIFIER not null, Hostname TEXT not null, LoggerName TEXT not null, LogLevel INTEGER not null, Message TEXT not null, primary key (Id)) 
create table Properties (Id INTEGER not null, Key TEXT, Value TEXT, LogEntry_id UNIQUEIDENTIFIER, Index INTEGER, primary key (Id)) 

Aber es schlägt mit dem folgenden Fehler

System.Data.SQLite.SQLiteException: SQLite error 
near "Index": syntax error 

Die Einheiten:

public class LogEntry 
{ 
    public virtual Guid Id { get; set; } 

    public virtual string LoggerName { get; set; } 

    public virtual string Message { get; set; } 

    public virtual int LogLevel { get; set; } 

    public virtual string Hostname { get; set; } 

    public virtual IList<Property> Properties { get; set; } 
} 

public class Property 
{ 
    public virtual int Id { get; set; } 

    public virtual string Key { get; set; } 

    public virtual string Value { get; set; } 
} 

Und die Mapping-Klassen

public class LogEntryMap : ClassMap<LogEntry> 
{ 
    public LogEntryMap() 
    { 
     Table("LogEntries"); 
     Id(x => x.Id).GeneratedBy.GuidComb(); 

     Map(x => x.Hostname).Not.Nullable(); 
     Map(x => x.LoggerName).Not.Nullable(); 
     Map(x => x.LogLevel).Not.Nullable(); 
     Map(x => x.Message).Not.Nullable(); 

     HasMany(x => x.Properties).Cascade.AllDeleteOrphan().AsList(); 
    } 
} 

public class PropertyMap : ClassMap<Property> 
{ 
    public PropertyMap() 
    { 
     Table("Properties"); 

     Id(x => x.Id).GeneratedBy.Increment(); 

     Map(x => x.Key); 
     Map(x => x.Value); 
    } 
} 
+0

Das Problem gefunden. In der Mapping-Klasse für logEntry verwende ich AsList(). Wenn ich das entferne funktioniert es – Thomas

Antwort

3

Ich lerne gerade NHibernate selbst (Lesen NHibernate 3.0 Kochbuch), also bin ich kein Experte.

Ich habe das gleiche Problem im Moment, eine HasMany-Map Parent.Children in einer SQLite-Umgebung. Dies stürzt auch beim Index-Syntaxfehler ab.

Aus was ich abgeleitet habe, ist Index ein reserviertes Schlüsselwort (ist es nicht in fast jedem RDBMS?). Es scheint, dass diese Schlüsselwörter standardmäßig nicht maskiert sind und daher das SQL-Skript ungültig ist.

Nach dem Buch, können Sie die Spaltennamen entkommen, indem sie eine Graviszeichen auf die Spaltennamen hinzugefügt:

HasMany(x => x.Children).Cascade.AllDeleteOrphan().AsList(p => p.Column("`Index")); 

Doch obwohl dieses „Werk“, es die folgende SQL-Abfrage generiert, das scheint haben die x fallen gelassen:

create table Child (
    Id INTEGER not null, 
    ChildType TEXT not null, 
    Version INTEGER not null, 
    Content TEXT, 
    Title TEXT not null, 
    Parent_id INTEGER, 
    "Inde" INTEGER, 
    primary key (Id) 
) 

Also, entweder betrachten:

  • einen benutzerdefinierten Index column Angabe w hich ist kein Schlüsselwort,
  • verlassen auf dem backtick Auto-Escape (keine Ahnung was hier geschieht, keine Zeit zu überprüfen)
  • Verwenden Sie eine andere Sammlungsart, wenn Sie nicht wirklich eine geordnete Liste benötigen. Siehe List vs Set vs Bag in NHibernate
+0

Für mich die Angabe von "Index" funktioniert - in Ihrem Code sieht es aus wie Sie die zweite Back-Tick fehlt. – Oliver

Verwandte Themen