2010-09-10 4 views
3

Я пытаюсь начать работу с Castle ActiveRecord (после "Getting started with ActiveRecord" screencast).Невозможно создать схему с Castle ActiveRecord

Я создал два класса ActiveRecord, один из которых называется User. Я добавил соответствующие строки в файл app.config, и я инициализирую с помощью:

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

ActiveRecordStarter.CreateSchema(); 

К сожалению, когда я запускаю это, я получаю следующее исключение:

Необработанное исключение: Castle.ActiveRecord.Framework .ActiveRecordException: Не удалось создать схему ---> NHibernate.HibernateException: Неверный синтаксис рядом с ключевым словом «Пользователь». ---> System.Data.SqlClient.SqlException: Неправильный синтаксис около ключевого слова «User»

Я загрузил небольшую репродукцию к http://bitbucket.org/hmemcpy/general, может кто-то пожалуйста, скажите мне, что я сделал не так?

Спасибо!

ответ

3

«пользователя» является зарезервированным словом в сервере SQL, команда SQL выполняется это:

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

Это незаконно имя таблицы пользователя в сервере SQL, но это законно назвать его [Пользователь].

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

В качестве решения можно определить различные имена таблиц и столбцов, названных зарезервированных слов:

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

При использовании [] вокруг имени таблицы, зарезервированные имена разрешены. То же самое имеет отношение для отношения столбцов:

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

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

Конечно, любое другое имя, как [ActiveRecord("SomeUser")] будет работать.

+0

Спасибо Elish :) Я так понял, я переименовал класс 'User' в' XUser', и он работал :) –