Могу ли я использовать два разных контекста EntityFramework в одной базе данных SqlServer Compact? - PullRequest
5 голосов
/ 07 ноября 2011

У меня есть база данных SqlServer Compact Edition, которая содержит 2 таблицы.

Для каждой из этих таблиц у меня есть класс контекста, производный от DbContext, который используется приложением для доступа к таблице.

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

Я использую подход, основанный на коде, мой код определяет сущности и модель,и я позволил Entity Framework создать базу данных для меня.

Моя проблема заключается в следующем: как я могу позволить Entity Framework автоматически создавать базу данных и таблицы для меня при инициализации контекста, но при этом все 2 контекста совместно используют одно и то же?база данных и соединение?

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

The model backing the 'SomeObjectContext' context has changed since the database 
was created. Either manually delete/update the database, or call Database.SetInitializer
with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges 
strategy will automatically delete and recreate the database, and optionally seed it with 
new data.

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

Буду признателен за любые советы по ее решению.

Спасибо

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Вы не можете использовать CodeFirst таким образом только с одной базой данных. CodeFirst должен проверить классы модели на соответствие структуре БД (они должны быть «синхронизированы»).

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

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

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

2 голосов
/ 26 ноября 2013

Да, вы можете использовать несколько контекстов БД, указывающих на одну и ту же БД.

Артур Викерс из команды Entity Framework рекомендует следующий шаблон….

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

 <connectionStrings>
        <add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" />
    </connectionStrings>

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

using System.Data.Entity; 

namespace DataLayer
{
    public class BaseContext<TContext> : DbContext where TContext : DbContext
    {
        static BaseContext()
        {
            Database.SetInitializer<TContext>(null); 
        }
        protected BaseContext()
            : base("name=MyDBContext")
        {
        }

    }
}

Теперь наследуйте это базовое поведение в каждом контексте (например):

namespace DataLayer.Models

    {
        public class OrderContext : BaseContext<OrderContext>

    …

    namespace DataLayer.Models
    {
        public class ProductContext : BaseContext<ProductContext>
    …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...