Silverlight / ASP.NET - динамическое указание на базу данных с использованием ADO.NET/Domain Services - PullRequest
0 голосов
/ 09 января 2012

Я новичок в Silverlight и следую учебному пособию Silverlight для бизнес-приложений . Я подключил файл MDF с помощью ADO.NET Entity Model и Domain Service, как показано на видео, и все это работает нормально.

Сложность возникает из-за необходимости динамически указывать на базу данных.

В моем приложении пользователи будут входить в систему. После входа в систему программа будет настраивать работу на основе пользователя. Это означает, что мне нужно указывать на пользовательскую базу данных из приложения Silverlight после аутентификации.

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

string fileName = string.Empty;
void OnContextCreated()
{
    this.Connection.ConnectionString = GenerateConnectionString(".\\SQLEXPRESS", "|DataDirectory|\\" + fileName + ".mdf");
}

public static string GenerateConnectionString(string dbServer, string fileName)
{
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();

    // Set the properties for the data source.
    sqlBuilder.DataSource = dbServer;
    //sqlBuilder.InitialCatalog = dbName;
    //sqlBuilder.UserID = "YOUR_USERNAME";
    //sqlBuilder.Password = "YOUR_PASSWORD";
    sqlBuilder.IntegratedSecurity = true;
    sqlBuilder.AttachDBFilename = fileName;
    sqlBuilder.UserInstance = true;
    sqlBuilder.MultipleActiveResultSets = true;
    sqlBuilder.ApplicationName = "EntityFramework";

    // Build the SqlConnection connection string.
    string providerString = sqlBuilder.ToString();

    // Initialize the EntityConnectionStringBuilder.
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();

    //Set the provider name.
    entityBuilder.Provider = "System.Data.SqlClient";

    // Set the provider-specific connection string.
    entityBuilder.ProviderConnectionString = providerString;

    // Set the Metadata location.
    entityBuilder.Metadata = @"res://*/Model.csdl|
                   res://*/Model.ssdl|
                   res://*/Model.msl";

    return entityBuilder.ToString();
}

Если это вообще возможно, я хотел бы придерживаться методов, показанных в видео, используя доменные службы и ADO.NET Entity Models, потому что я получаю доступ к функциональности RIA Services, позволяя мне перетаскивать таблицы, нажимать изменения и т. д. с большой легкостью.

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

Редактировать

Все базы данных SQL, на которые я буду указывать, имеют одинаковую структуру. То есть у них одинаковые таблицы и поля. Пользовательские данные заполняются в эти поля.

1 Ответ

0 голосов
/ 09 января 2012

Чтобы сделать это успешно, вам нужен отдельный слой данных.

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

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

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

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

Когдареализованная таким образом, ваша бизнес-логика не должна меняться каким-либо образом при доступе к различным базам данных.

Шаблон MVVM обычно используется по умолчанию для приложений Silverlight / WPF, но вы обнаружите, что большинство обучающихВ примерах используется шаблон по умолчанию, согласно которому бизнес-логика находится в коде файлов.Это нормально, пока вы не начнете пытаться вносить большие изменения либо в свой код доступа к данным, либо в бизнес-логику, когда обнаружите, что изменяете гораздо больше кода, чем нужно.

edit

Вот несколько ссылок, подробно описывающих MVVM и Silverlight.

http://msdn.microsoft.com/en-us/magazine/dd458800.aspx

http://www.silverlight.net/learn/advanced-techniques/the-mvvm-pattern/using-the-mvvm-pattern-in-silverlight-applications

http://www.codeproject.com/KB/silverlight/MVVMSilverlight.aspx

Вот несколько ссылок, детализирующих шаблон репозитория для слоя данных:

http://msdn.microsoft.com/en-us/library/ff649690.aspx

http://www.devx.com/dotnet/Article/33695/0/page/5

http://www.codeproject.com/KB/architecture/linqrepository.aspx

...