Свободный Nhibernate - как указать схемы таблиц при автоматической генерации таблиц в SQL CE 4 - PullRequest
2 голосов
/ 16 ноября 2011

Я использую SQL CE в качестве базы данных для выполнения локальных и интеграционных тестов CI (обычно наш сайт работает на обычном сервере SQL).Мы используем Fluent Nhibernate для нашего отображения и заставляем его создавать нашу схему из наших Mapclasses.Есть только два класса с отношениями один ко многим между ними.В нашей реальной базе данных мы используем схему не dbo.Сначала код не будет работать с этой реальной базой данных, пока я не добавлю имена схем в методы Table ().Однако выполнение этого прервало модульные тесты с ошибкой ...

System.Data.SqlServerCe.SqlCeException : There was an error parsing the query. [ Token line number = 1,Token line offset = 26,Token in error = User ]

Это классы и ассоциативные MapClasses (упрощенно, конечно)

    public class AffiliateApplicationRecord
{
    public virtual int Id { get; private set; }
    public virtual string CompanyName { get; set; }
    public virtual UserRecord KeyContact { get; private set; }

    public AffiliateApplicationRecord()
    {
        DateReceived = DateTime.Now;
    }

    public virtual void AddKeyContact(UserRecord keyContactUser)
    {
        keyContactUser.Affilates.Add(this);
        KeyContact = keyContactUser;
    }
}

public class AffiliateApplicationRecordMap : ClassMap<AffiliateApplicationRecord>
{
    public AffiliateApplicationRecordMap()
    {
        Schema("myschema");
        Table("Partner");
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.CompanyName, "Name");
                    References(x => x.KeyContact)
            .Cascade.All()
            .LazyLoad(Laziness.False)
            .Column("UserID");       
    }
}

public class UserRecord
{
    public UserRecord()
    {
        Affilates = new List<AffiliateApplicationRecord>();
    }

    public virtual int Id { get; private set; }
    public virtual string Forename { get; set; }
    public virtual IList<AffiliateApplicationRecord> Affilates { get; set; }
}

public class UserRecordMap : ClassMap<UserRecord>
{
    public UserRecordMap()
    {
        Schema("myschema");
        Table("[User]");//Square brackets required as user is a reserved word
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Forename);

        HasMany(x => x.Affilates);

    }
}

А вот беглая конфигурация iЯ использую ....

      public static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(
                MsSqlCeConfiguration.Standard
                    .Dialect<MsSqlCe40Dialect>()
                    .ConnectionString(ConnectionString)
                    .DefaultSchema("myschema"))
            .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(AffiliateApplicationRecord).Assembly))
            .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
            .ExposeConfiguration(x => x.SetProperty("connection.release_mode", "on_close")) //This is included to deal with a SQLCE issue /1962172/assertionfailure-nulevoi-identifikator-fluentnh-sqlserverce
            .BuildSessionFactory();

    }

Документация по этому аспекту свободно говорит, поэтому любая помощь будет оценена

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Как обычно, через 10 минут после публикации я отвечаю на свои вопросы.Хитрость заключалась в том, чтобы не объявлять схему в ClassMaps.Вместо этого я использовал метод DefaultSchema в свободной конфигурации.Таким образом, моя фактическая конфигурация в реальном времени выглядит следующим образом:

var configuration = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("connectionStringKey"))
            .DefaultSchema("myschema"))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AffiliateApplicationRecord>());

        return configuration;

А мои интеграционные тесты выглядят так:

return Fluently.Configure()
            .Database(
                MsSqlCeConfiguration.Standard
                    .Dialect<MsSqlCe40Dialect>()
                    .ConnectionString(ConnectionString))
            .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(AffiliateApplicationRecord).Assembly))
            .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
            .ExposeConfiguration(x => x.SetProperty("connection.release_mode", "on_close")) //This is included to deal with a SQLCE issue /1962172/assertionfailure-nulevoi-identifikator-fluentnh-sqlserverce
            .BuildSessionFactory();

Надеюсь, кто-то еще получит какое-то значение из этого ...

0 голосов
/ 16 ноября 2011

Я думаю, что это больше связано с SQL Server CE, чем с nhibernate. Я почти уверен, что Sql Server CE вообще не будет принимать схемы. это не поддерживаемая функция.

См. Создать таблицу Документация по MSDN

...