Как вы используете один ObjectContext для нескольких типов баз данных? - PullRequest
2 голосов
/ 15 августа 2011

Я изо всех сил пытаюсь найти правильную, точную или хорошо объясненную документацию для конкретных вопросов Entity Framework, но я разрабатываю приложение, которое будет поддерживать несколько типов баз данных.Первоначально он был построен на DLinq, но теперь мы добавляем поддержку.Мы пытались разработать нашу собственную систему, которая работала, но работала медленно, IQToolkit, а теперь и Entity.

Мой вопрос: как вы используете один ObjectContext для поддержки нескольких типов баз данных?В сборке, где мы изначально использовали DLinq, повсеместно присутствуют экземпляры DatabaseContext в качестве элемента для каждой транзакции.Когда мы попробовали IQToolkit, мы смогли абстрагировать вызовы в наш статический класс Shell, который может выполнять «Shell.Database.DoSomething», где «Shell.Database» был независимым от базы данных объектом, которому было все равно, с какой базой данных он разговаривает.Рамки сделали всю работу.Сейчас мы пытаемся изучить Entity Framework для лучшего решения, но я не хочу, чтобы везде в приложении был код, который должен создавать другой контекст на основе сконфигурированной базы данных.Было бы легко иметь один абстрагированный объект, который работает под капотом, поэтому для работы с базой данных используется только один объект, который, как мне показалось, был смыслом ObjectContext.Однако мы сталкиваемся с небольшими проблемами.

Чтобы исправить наше обучение, у меня есть тестовый проект для изучения Entity с простой таблицей Customers, такой как:

enter image description here

Как видите, я использую одну модель EDMX, которая определяет схему, и у меня есть отдельные файлы метаданных для каждого типа базы данных. Первоначально EDMX был создан путем выбора существующей базы данных MySQL Версия Northwind для MSSQL имеет ту же схему, за исключением того, что схема MySQL использует varchar (36) для GUID, поскольку в MySQL нет примитива Guid.Способ, которым я это создаю, заключается в следующем:

private static void InitMySql() {
    MySqlConnectionStringBuilder builder1 = new MySqlConnectionStringBuilder();
    builder1.Server = "win-x58";
    builder1.Database = "Northwind";
    builder1.UserID = "root";
    builder1.Password = "<password>";

    EntityConnectionStringBuilder builder2 = new EntityConnectionStringBuilder();
    builder2.Metadata = @".\Metadata\MySQL\";
    builder2.Provider = "MySql.Data.MySqlClient";
    builder2.ProviderConnectionString = builder1.ToString();

    m_Context = new NorthwindObjectContext(builder2.ToString());
}

private static void InitMSSql() {
    SqlConnectionStringBuilder builder1 = new SqlConnectionStringBuilder();
    builder1.DataSource = "win-x58";
    builder1.InitialCatalog = "Northwind";
    builder1.IntegratedSecurity = true;

    EntityConnectionStringBuilder builder2 = new EntityConnectionStringBuilder();
    builder2.Metadata = @".\Metadata\MSSQL\";
    builder2.Provider = "System.Data.SqlClient";
    builder2.ProviderConnectionString = builder1.ToString();

    m_Context = new NorthwindObjectContext(builder2.ToString());
}

Теперь соединения MySQL работают и работают.Я могу запросить базу данных и увидеть результаты.Однако, когда я пытаюсь сделать это, когда его экземпляр создается с использованием строки подключения MSSQL с использованием этого кода:

foreach (Customer item in m_Context.Customers) {
    Console.Out.WriteLine(item.Name);
}

, я получаю следующее исключение:

MetadataException
Schema specified is not valid. Errors: 
Entities.ssdl(10,6) : error 0040: The Type guid is not qualified 
with a namespace or alias. Only PrimitiveTypes can be used without qualification.

SSDL для MSSQL:

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="northwindModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
  <EntityContainer Name="northwindModelStoreContainer">
    <EntitySet Name="Customers" EntityType="northwindModel.Store.Customers" store:Type="Tables" Schema="northwind" />
  </EntityContainer>
  <EntityType Name="Customers">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="guid" Nullable="false" />
    <Property Name="Name" Type="varchar" MaxLength="45" />
    <Property Name="Email" Type="varchar" MaxLength="45" />
    <Property Name="Phone" Type="varchar" MaxLength="12" />
  </EntityType>
</Schema>

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

1 Ответ

2 голосов
/ 16 августа 2011

Guid является , а не типом базы данных SQL Server;следовательно ошибка.

Guid на языке SQL Server: uniqueidentifier

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