Entity Framework переключения между моделями - PullRequest
1 голос
/ 07 июля 2010

В моей компании есть устаревшее приложение, которое все еще используется.Я в процессе портирования его на asp.net (используя mvc framework), а также должен создать новую функциональность.Поскольку он используется, я должен разработать его поверх существующей базы данных, которая была разработана очень плохо (не все отношения существуют, триггеры используются вместо отношений, многие поля больше не используются). Поэтому я планирую создать новую базу данных позже.,Я планирую создать другую модель EF, но чтобы все пространства имен и имена классов были одинаковыми, правильно?Что делать, если я хотел бы переключить его обратно?Как организовать мой код, модель и т. Д., Чтобы упростить переключение на другую базу данных.Я был бы очень признателен за любую помощь.

РЕДАКТИРОВАТЬ Если быть более точным, я бы хотел, чтобы мое приложение работало как на старых, так и на новых базах данных.Имейте в виду, что схема 2 дБ отличается

Ответы [ 2 ]

1 голос
/ 07 июля 2010

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

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

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

interface IAnimalRepository
{
    IQueryable<Animal> SelectAll();
    Animal Insert(Animal newRecord);
    // etc.
}

Теперь вы пишете свой сервисный / бизнес-уровень для этого интерфейса, а не прямо для контекста.

Вы можете реализоватьскажем, интерфейс для «старого» отображения EF, например:

class AnimalRepository: IAnimalRepository
{
    private OldEntities Context { get; set; }

    public AnimalRepository(OldEntities context)
    {
        this.Context = context;
    }

    IQueryable<Animal> IAnimalRepositorySelectAll()
    {
        return from oa in Context.OldAnimals
               select new Animal  // Animal is a POCO
               {
                   Id = oa.Id,
                   Name = oa.Name
               };
    }

    // etc.
}

Второй вариант - выполнить условное отображение.В этом случае вы будете использовать новую функциональность Code First, которая в настоящее время находится в CTP для Entity Framework 4, которая позволяет указывать имена таблиц и строк во время выполнения.

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

0 голосов
/ 07 июля 2010

У меня похожая ситуация, когда у меня было приложение, не основанное на Oracle. Я переключил его на систему баз данных sql server EF и перестроил приложение поверх этого. То, что я сделал бы, когда вы переносите на новый фреймворк (ASP MVC), - это также начните снова с базы данных. Что вы можете сделать, это написать код C # для импорта из старой базы данных в новую базу данных, выполнения любых преобразований между полями и т. Д. Как часть процесса импорта. Когда я выполнял конвертацию, у меня был ночной импорт в новую систему из старой системы, что позволило пользователям быстрее освоиться с новой системой, поскольку они могли видеть существующие данные.

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