Строка динамического подключения Silverlight Entity Framework - PullRequest
0 голосов
/ 04 декабря 2010

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

Мои пользователи могут иметь несколько баз данных на нескольких серверах. Мне нужен чистый способ создания строки подключения при создании службы DomainService.

Я вижу, что DomainService имеет переопределение (унаследованное от LinqToEntitiesDomainService), называемое CreateObjectContext (), которое позволит мне установить любую строку подключения, которую я хочу, а затем вернуть новую сущность, и жизнь будет хорошей. Проблема в том, что CreateObjectContext () вызывается после конструктора, поэтому я не могу установить строку с помощью метода invoke. Кроме того, я попытался создать новый параметризованный конструктор в DomainService, но он никогда не копируется в DomainContext на клиенте.

CreateObjectContext () отлично работал бы, если бы мне удалось вытащить строку подключения, но, поскольку я должен использовать данные клиента, чтобы выяснить, к какой БД подключиться, это, очевидно, не будет работать.

Чем больше я об этом думаю, тем больше я чувствую, что пользовательский конструктор - это именно то, что мне нужно - просто не могу понять, как это сделать.

Чего мне не хватает?

1 Ответ

5 голосов
/ 05 декабря 2010

Я нашел решение. Для тех, кто заинтересован, вот оно:

Это похоже на взлом, но это единственное решение, которое я могу придумать. Спасибо Салли Сю на форумах.silverlight.net за идеи.

Поскольку каждый из моих пользователей может иметь несколько баз данных на нескольких серверах, мне нужно было найти способ создания ConnectionString до того, как DomainService использовался впервые. Каждый раз, когда пользователь выбирает новый проект в пользовательском интерфейсе, я устанавливаю файл cookie следующим образом:

private void SetCookie(string cookieName, string cookieValue)
{
  DateTime expireDate = DateTime.Now + TimeSpan.FromDays(1); 
  string newCookie = cookieName + "=" + cookieValue + ";expires=" + expireDate.ToString("R");
  HtmlPage.Document.SetProperty("cookie", newCookie);
}

CookieName - SelectedProjectId, а cookieValue - текущий выбранный проект в моем пользовательском интерфейсе.

Затем я создаю новый DomainService как обычно, но я переопределяю CreateObjectContext(). Этот метод вызывается при первой ссылке на ваш объект DomainService. Моя переопределение выглядит так:

protected override ProjectEntities CreateObjectContext()
{
  long projectId = -1;
  StringBuilder connection;
  if (System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"] != null)
  {
    projectId = Convert.ToInt64(System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"].Value);
  }
  else throw new Exception("Selected Project ID Exception");  // temporary

  // Verify this user has access to the DB just in case it's spoofed 

  // Lookup project ID in my database to get the database name and server name

  // Load template connection string found in web.config
  // Replace the template holders for SERVER_NAME and DATABASE_NAME with above lookup values

  return new ProjectEntities(MyDynamicConnectionString);      
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...