Nano Hash - криптовалюты, майнинг, программирование

Как переопределить строку подключения в коде автоматически сгенерированной модели объекта

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

Среда: у меня есть две среды разработки и производства для службы WCF. Я храню строки подключения в файле web.config. Когда это приложение запустится, установите переменную с правильной строкой подключения для использования.

Проблема: когда создается модель данных, она создает 2 файла dmMyDataModel.edmx и dmMyDataModel.Designer.cs, в файле конструктора есть конструкторы, которые определяют соединение с EntityDatabas.

В приведенном ниже коде вы можете видеть, что я создал конструктор в службе, который при вызове службы устанавливает контекст для использования правильной строки подключения. Но только элементы, использующие myContext, работают правильно (хранимые процедуры), а запросы dbMyWebSiteEntities завершаются ошибкой в ​​производственной среде, поскольку они по-прежнему зависят от строки подключения, установленной в конструкторе.

Я устал настраивать логику в дизайнере, но она стирается при повторном создании.

dmMyDataModel.Designer.cs

using System;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Data.EntityClient;
using System.ComponentModel;
using System.Xml.Serialization;
using System.Runtime.Serialization;

[assembly: EdmSchemaAttribute()]

namespace MyWebSite.Services
{
    #region Contexts

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    public partial class dbMyWebSiteEntities : ObjectContext
    {
        #region Constructors

        /// <summary>
        /// Initializes a new dbMyWebSiteEntities object using the connection string found in the 'dbMyWebSiteEntities' section of the application configuration file.
        /// </summary>
        public dbMyWebSiteEntities() : base("name=dbMyWebSiteEntities", "dbMyWebSiteEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }

        /// <summary>
        /// Initialize a new dbMyWebSiteEntities object.
        /// </summary>
        public dbMyWebSiteEntities(string connectionString) : base(connectionString, "dbMyWebSiteEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
        /// <summary>
        /// Initialize a new dbMyWebSiteEntities object.
        /// </summary>
        public dbMyWebSiteEntities(EntityConnection connection) : base(connection, "dbMyWebSiteEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }

        #endregion
        ...
    }

MyWebSiteData.svc.cs

using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
using System.ServiceModel.Activation;
using System.ServiceModel;
using System.Data.EntityClient;
using System.Configuration;
using System.Data.Objects;

namespace MyWebSite.Services
{
    public class MyWebSiteData : DataService<dbMyWebSiteEntities>
    {
        private dbMyWebSiteEntities myContext;

        public static void InitializeService(DataServiceConfiguration config)
        {
            config.UseVerboseErrors = true; 
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.SetEntitySetPageSize("*", 25);

            config.SetServiceOperationAccessRule("mar_getAllByKey", ServiceOperationRights.AllRead);
        }

        //Constructor to override the connection string used in the dmMyDataModel.Designer.cs
        public MyWebSiteData()
        {
            //sets the connetion string and appends the environment so it will pull the correct one from the web.config
            EntityConnection conn = new EntityConnection("name=dbMyWebSiteEntities" + HttpContext.Current.Application["Environment"]);
            myContext = new dbMyWebSiteEntities(conn);
        }

        //This returns the data from the stored procedures
        [WebGet]
        public ObjectResult<myTable> mar_getAllByKey(string key)
        {
            return myContext.mar_getAllByKey(key);
        }
    }
}

Спасибо, что нашли время, чтобы посмотреть на это. Я пытался быть конкретным и подробным, но если я что-то упустил, дайте мне знать.

Спасибо, Джеральд


Ответы:


1

Сгенерированный класс partial. Если вы хотите добавить новые конструкторы, определите другой разделяемый класс (с тем же именем класса и пространством имен) в другом файле и добавьте туда свои конструкторы. Ваш файл не будет восстановлен. Вот для чего нужно ключевое слово partial.

Ваш новый конструктор должен быть уникальным — разные параметры.

Вы также можете определить статический фабричный метод в своем частичном классе, который будет инкапсулировать логику создания экземпляра.

Я устанавливаю разные строки подключения в файлах .config, используя преобразования Xml для каждой имеющейся у меня среды (Dev/Test/Beta/Prod).

16.03.2011
  • Является ли пример Мозга ниже того, что вы говорите о статическом фабричном методе? Извините, я все еще оборачиваю голову вокруг ООП. 17.03.2011

  • 2

    Лучший способ - создать оболочку:

    public static class DBContextCreator
    {
       public static MyDBContext Create()
       {
            return new MyDBContext(/* pass in connection of choice here */);
       }
    }
    

    В этой оболочке вы можете обрабатывать различную логику различными способами.

    ХТН.

    16.03.2011
  • Привет Брайан. Это создает новый контекст. Когда служба запускается, она создает контекст из сгенерированного конструктора, это тот, для которого я хотел бы иметь возможность изменить строку подключения. Когда я делаю так, как вы предложили выше, он создает новый экземпляр и будет использовать правильную строку подключения только при использовании этого нового контекста. 17.03.2011
  • Вы не можете изменить строку подключения; соединение должно быть установлено при создании контекста объекта и не может быть изменено после этого. Изменить его означает восстановить контекст. Если у вас есть какие-либо объекты LINQ, вы должны отсоединить их от существующего контекста и снова присоединить к новому контексту. 17.03.2011

  • 3

    Вы можете найти аналогичный запрос в более здесь

    В нем приведен пример использования класса EntityConnectionStringBuilder в пространстве имен System.Data.Common.DbConnectionStringBuilder.

    18.03.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..