2010-09-10 7 views
3

J'essaie de démarrer avec Castle ActiveRecord (après le "Getting started with ActiveRecord" screencast).Impossible de créer un schéma avec Castle ActiveRecord

J'ai créé deux classes ActiveRecord, l'une d'entre elles nommée User. J'ai ajouté les chaînes pertinentes au fichier app.config, et j'initialize en utilisant:

var config = ActiveRecordSectionHandler.Instance; 
ActiveRecordStarter.Initialize(typeof(User).Assembly, config); 

ActiveRecordStarter.CreateSchema(); 

Malheureusement, quand je lance, je reçois l'exception suivante:

Exception non gérée: Castle.ActiveRecord.Framework .ActiveRecordException: Impossible de créer le schéma ---> NHibernate.HibernateException: Syntaxe incorrecte près du mot-clé 'Utilisateur'. ---> System.Data.SqlClient.SqlException: syntaxe incorrecte près du mot clé « utilisateur »

J'uploadé une petite reproduction à http://bitbucket.org/hmemcpy/general, quelqu'un pourrait me dire s'il vous plaît qu'ai-je fait de mal?

Merci!

Répondre

3

« utilisateur » est un mot réservé dans le serveur SQL, la commande SQL en cours d'exécution est:

create table User (Id INT IDENTITY NOT NULL, 
        UserName NVARCHAR(255) null unique, 
        primary key (Id)) 

Il est illégal de nommer un utilisateur de table dans SQL Server, mais il est légal de le nommer [Utilisateur].

create table [User] (Id INT IDENTITY NOT NULL, 
        UserName NVARCHAR(255) null unique, 
        primary key (Id)) 

Comme solution, vous pouvez définir différents noms pour les tables et colonnes nommées par mots réservés:

[ActiveRecord("[User]")] 
public class User : ActiveRecordLinqBase<User> 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 

    [Property(Unique = true)] 
    public string UserName { get; set; } 

    [HasMany] 
    public IList<Activity> Activities { get; set; } 
} 

Lorsque vous utilisez un [] autour du nom de la table, les noms réservés sont autorisés. La même chose est pertinente pour les colonnes de relation:

[ActiveRecord] 
public class Activity : ActiveRecordLinqBase<Activity> 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 

    [BelongsTo("[User]")] 
    public User User { get; set; } 
} 

Bien sûr, tout autre nom comme [ActiveRecord("SomeUser")] fonctionnera.

+0

Merci Elish :) Je me suis dit, j'ai renommé la classe 'User' en' XUser' et ça a marché :) –

Questions connexes