NHibernate - Как изменить схемы во время выполнения? - PullRequest
1 голос
/ 30 октября 2009

Я использую NHibernate для подключения к базе данных ERP на нашем сервере DB2. У нас есть схема тестирования и схема производства. Обе схемы имеют одинаковую структуру таблицы внизу. Для тестирования я хотел бы использовать те же классы отображения, но при необходимости указывать NHibernate на тестовую среду, а затем возвращаться в производство. Помните, что у нас есть много производственных схем, и каждая производственная схема имеет эквивалентную схему тестирования.

Я знаю, что в моем файле отображения XML есть свойство схемы, но, поскольку оно находится в XML, я не могу изменить его с помощью директивы компилятора или изменить свойство схемы на основе файла конфигурации.

Есть идеи?

Спасибо.

Ответы [ 5 ]

1 голос
/ 11 апреля 2013

Код для исправления ресурсов HBM XML.

    // This is how you get all the hbm resource names.
    private static IList<string> GetAllHbmXmlResourceNames(Assembly assembly)
    {
        var result = new List<string>();

        foreach (var resource in assembly.GetManifestResourceNames())
        {
            if (resource.EndsWith(".hbm.xml"))
            {
                result.Add(resource);
            }
        }

        return result;
    }
    // This is how you get the stream for each resource.
    Assembly.Load(assembly).GetManifestResourceStream(name)
    // What you need to do next is to fix schema name in this stream
    // Replacing schema name.
    private Stream FixSchemaNameInStream(Stream stream)
    {
        StreamReader strStream = new StreamReader(stream);
        string strCfg = strStream.ReadToEnd();
        strCfg = strCfg.Replace(string.Format("schema=\"{0}\"" , originalSchemaName), string.Format("schema=\"{0}\"" , newSchemaName));

        return new MemoryStream(Encoding.ASCII.GetBytes(strCfg));
    }
1 голос
/ 25 марта 2013

Я нашел следующую ссылку, которая фактически решает проблему.

Как настроить схему базы данных для пространства имен в nhibernate

Пример кода может быть

cfg.ClassMappings.Where(cm => cm.Table.Schema == "SchemaName")
    .ForEach(cm => cm.Table.Schema = "AnotherSchemaName");

Это должно произойти до того, как вы инициализируете свой собственный класс обслуживания данных.

@ Брайан, я пробовал NHibernate.Mapping.Attributes, значение атрибута, которое вы помещаете внутрь, должно быть константой. Так что это не может быть обновлено во время выполнения. Как вы могли установить значение свойства, используя значение параметра в файле конфигурации?

1 голос
/ 24 декабря 2009

Чтобы получить то, что я хотел, мне пришлось использовать NHibernate.Mapping.Attributes.

[NHibernate.Mapping.Attributes.Class (0, таблица = «MyTable», схема = MySchemaConfiguration.MySchema)]

Таким образом, я могу создать класс, такой как MySchemaConfiguration, и иметь свойство внутри него, такое как MySchema. Я могу либо установить значение свойства с помощью директивы компилятора, либо получить его через файл конфигурации. Таким образом, мне нужно всего лишь изменить схему в одном месте, и она будет отражена во всех других сопоставлениях.

1 голос
/ 30 октября 2009

Нет необходимости указывать схему в сопоставлениях: есть параметр уровня SessionFactory с именем default_schema . Однако вы не можете изменить его во время выполнения, поскольку NHibernate создает и / или кэширует SQL-запросы, включая часть схемы.

0 голосов
/ 30 октября 2009
...