Как экспортировать схему NHibernate для SQLite, если у меня есть точки в имени схемы? - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь настроить SQLite для модульного тестирования с Fluent NHibernate , как показано здесь , но имена таблиц генерируются не так, как я ожидал.

Некоторые таблицы имеют схемы с точками внутри, которые, кажется, нарушают генерацию. (Точки прекрасно работают с Microsoft SQL Server, который есть в моей рабочей среде.)

Пример:

[Foo.Bar.Schema].[TableName]

Результат:

TestFixture failed: System.Data.SQLite.SQLiteException : SQLite error
unknown database Foo

Как я могу дать SQLite команду переводить точки в подчеркивания или что-то еще, чтобы я мог запускать свои модульные тесты?

(я пытался добавить скобки к именам схем безуспешно)

1 Ответ

1 голос
/ 11 августа 2011

Вы можете использовать соглашение http://wiki.fluentnhibernate.org/Conventions

* ОБНОВЛЕНО

public static class PrivatePropertyHelper
    {
        // from http://stackoverflow.com/questions/1565734/is-it-possible-to-set-private-property-via-reflection
        public static T GetPrivatePropertyValue<T>(this object obj, string propName)
        {
            if (obj == null) throw new ArgumentNullException("obj");
            PropertyInfo pi = obj.GetType().GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            if (pi == null) throw new ArgumentOutOfRangeException("propName", string.Format("Property {0} was not found in Type {1}", propName, obj.GetType().FullName));
            return (T)pi.GetValue(obj, null);
        }
    }

public class CustomTableNameConvention : IClassConvention
{
    // Use this to set schema to specific value
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
    {
        instance.Schema("My_NEw_Schema");
        instance.Table(instance.EntityType.Name.CamelToUnderscoreLower());
    }


    // Use this to alter the existing schema value.
    // note that Schema is a private property and you need reflection to get it
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
    {          
        instance.Schema(instance.GetPrivatePropertyValue<string>("Schema").Replace(".", "_"));
        instance.Table(instance.EntityType.Name.CamelToUnderscoreLower());
    }
}

Вы должны использовать только один из методов Apply.

* ОБНОВЛЕНИЕ 2 Я не знаю, я бы порекомендовал это, но если вам нравится экспериментировать, похоже, это работает Еще больше размышлений :) 1009 *

    public static void SetSchemaValue(this object obj, string schema)
    {

        var mapping_ref  = obj.GetType().GetField("mapping", BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.GetField | BindingFlags.NonPublic).GetValue(obj);

        var mapping = mapping_ref as ClassMapping;
        if (mapping != null)
        {
            mapping.Schema = schema;
        }
    }


    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
    {
        var schema = instance.GetPrivatePropertyValue<string>("Schema");
        if (schema == null)
        {
            instance.Schema("My_New_Schema");
        }
        else
        {
            instance.SetSchemaValue("My_New_Schema");
        }
    }
...