none
Database first + Code First RRS feed

  • Вопрос

  • Добрый день. Подскажите как решить вопрос.

    Есть проект MVC3. Используется EF , модель данных проектировалась изначально как database first. В проекте пока используется SQLCE4. Проблем с изменением модели не возникало, при необходимости добавить сущность, добавлялась новая таблица, обновлялась EDMX. 

    Но сегодня у проекта 6 филиалов в разных городах. Данные в БД у всех разные. Как организовать изменение модели данных во всех филиалах, не трогая данные?

    На сайте EF говорится что можно использовать Code First, но как, нет почти данных. Добавил класс c конструктором

    public class Class1:DbContext{

    public Class1():base("name=Name1"){}

    publc DbSet<New> New {get; set}

    Так как теперь обновить то БД? Попытался с помощью миграции, но получил ответ:

    Creating a DbModelBuilder or writing the EDMX from a DbContext created using Database First or Model First is not supported. EDMX can only be obtained from a Code First DbContext created without using an existing DbCompiledModel.

    1) Как решить вопрос обновления модели данных на 6 одинаковых сайтах с минимальными временными потерями или

    2) Как обновлять схему БД, работая с CF после того как уже есть EDMX?

    27 июля 2012 г. 9:46

Ответы

  • " Как организовать изменение модели данных во всех филиалах, не трогая данные?" - всё зависит начколько глубоки эти изменения. Если поверхностные, то проблем будет немного. А если глубокие, добавление или изменение связей, удаление сущностей, то тут уже придётся похлопотать, плоть до частичной работы руками. Database first и Code first, два самых разных и противоположных подхода разработки с использованием Entity Framework. Поэтому, подход к проектированию приложения нужно выбирать с самого начала, а менять его уже в работающем приложении, мягко говоря - плохая практика. "На сайте EF говорится что можно использовать Code First, но как, нет почти данных." -  тут всё на принципах и соглашениях. На русском мало, что можно пока найти, а вот на английском, например книга Джули Лерман "Programming Entity Framework: DbContext". Использовать Code First для Вашего случая не является выходом, это подход для начала. Правда если у Вас есть уже работающая база, то можно подстроить сущностные классы Code First, под базу. Ччто касается автообновления БД с использованием Code First, то это касается чисто процесса разработки, ну или если обновления не очень глубокие. Да и БД не всегда генерируется, та кторую мы хотим. Для корректировки используется Fluent API и DatabaseInitializer, для того чтобы научиться с ними работать нужно некоторое время.

    "Как решить вопрос обновления модели данных на 6 одинаковых сайтах с минимальными временными потерями или" - однозначного ответа на этот вопрос нет. Всё зависит от глубины и изменений и структуры БД. Безболезненно думаю не получится, может даже возникнуть, что придётся работать руками. Нужно было думать об этом с самого начала, при проектировании. Чтобы сопровождение было насколько можно простым.

    "Как обновлять схему БД, работая с CF после того как уже есть EDMX?" - нужно создать новые сущностные классы(в Code First это обычные POCO, а не увесистые и наполненные кодом), и подстроить их под вашу БД. Но это будет уже как разработка с самого начала, особенно есль у Вас компоненты приложения не слабосвязанные.

    • Предложено в качестве ответа YatajgaModerator 30 июля 2012 г. 10:33
    • Помечено в качестве ответа YatajgaModerator 4 августа 2012 г. 7:09
    27 июля 2012 г. 17:13
    Модератор
  • EF Code First вообще не использует EDMX, как сказал высше тут всё на соглашениях. "Получается, что теперь все определения сущностей хранятся как мы и хотели в DbSet" - нет, опеределения сущностей и есть эти сущностные классы, это простые классы (POCO). Используя атрибуты и Fluent API они отображаются на базу, без каких-либо edmx файлов. "Теперь при включении миграции пишет: Unable to load the specified metadata resource." - похоже у Вас пока ищё ипользуется часть старого функционала. Посмотрите на стоку подключения, в Code First она должна быть простой, как обычно подключаются к ADO.NET, не содержащей никаких данных касательно EDMX файла. Если дело долшло на полный переход, то лучше всё написать вручную, удалив старый код. Где-то копируя, а где-то меняя вручную. Но если Вы думаете, что переход на Code First решит вашу проблему с последующей модификацие данных, то нет.
    • Предложено в качестве ответа YatajgaModerator 30 июля 2012 г. 10:33
    • Помечено в качестве ответа YatajgaModerator 4 августа 2012 г. 7:09
    28 июля 2012 г. 8:46
    Модератор

Все ответы

  • " Как организовать изменение модели данных во всех филиалах, не трогая данные?" - всё зависит начколько глубоки эти изменения. Если поверхностные, то проблем будет немного. А если глубокие, добавление или изменение связей, удаление сущностей, то тут уже придётся похлопотать, плоть до частичной работы руками. Database first и Code first, два самых разных и противоположных подхода разработки с использованием Entity Framework. Поэтому, подход к проектированию приложения нужно выбирать с самого начала, а менять его уже в работающем приложении, мягко говоря - плохая практика. "На сайте EF говорится что можно использовать Code First, но как, нет почти данных." -  тут всё на принципах и соглашениях. На русском мало, что можно пока найти, а вот на английском, например книга Джули Лерман "Programming Entity Framework: DbContext". Использовать Code First для Вашего случая не является выходом, это подход для начала. Правда если у Вас есть уже работающая база, то можно подстроить сущностные классы Code First, под базу. Ччто касается автообновления БД с использованием Code First, то это касается чисто процесса разработки, ну или если обновления не очень глубокие. Да и БД не всегда генерируется, та кторую мы хотим. Для корректировки используется Fluent API и DatabaseInitializer, для того чтобы научиться с ними работать нужно некоторое время.

    "Как решить вопрос обновления модели данных на 6 одинаковых сайтах с минимальными временными потерями или" - однозначного ответа на этот вопрос нет. Всё зависит от глубины и изменений и структуры БД. Безболезненно думаю не получится, может даже возникнуть, что придётся работать руками. Нужно было думать об этом с самого начала, при проектировании. Чтобы сопровождение было насколько можно простым.

    "Как обновлять схему БД, работая с CF после того как уже есть EDMX?" - нужно создать новые сущностные классы(в Code First это обычные POCO, а не увесистые и наполненные кодом), и подстроить их под вашу БД. Но это будет уже как разработка с самого начала, особенно есль у Вас компоненты приложения не слабосвязанные.

    • Предложено в качестве ответа YatajgaModerator 30 июля 2012 г. 10:33
    • Помечено в качестве ответа YatajgaModerator 4 августа 2012 г. 7:09
    27 июля 2012 г. 17:13
    Модератор
  • Может можно все-таки, как мне кажется мы на правильном пути. При помощи DBContext Generator, были сформированы DBContext и классы сущностей. Сам файл edmx остался в проекте, но вот класс с ObjectContext стерся. Получается, что теперь все определения сущностей хранятся как мы и хотели в DbSet. (Пришлось правда руками поменять теперь ненужные методы AddObject, DeleteObject на Add, Attach и Remove, а так же заменить методы модификации данных.), но это по времени не много заняло.  Теперь при включении миграции пишет:
    Unable to load the specified metadata resource.

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

    28 июля 2012 г. 7:59
  • EF Code First вообще не использует EDMX, как сказал высше тут всё на соглашениях. "Получается, что теперь все определения сущностей хранятся как мы и хотели в DbSet" - нет, опеределения сущностей и есть эти сущностные классы, это простые классы (POCO). Используя атрибуты и Fluent API они отображаются на базу, без каких-либо edmx файлов. "Теперь при включении миграции пишет: Unable to load the specified metadata resource." - похоже у Вас пока ищё ипользуется часть старого функционала. Посмотрите на стоку подключения, в Code First она должна быть простой, как обычно подключаются к ADO.NET, не содержащей никаких данных касательно EDMX файла. Если дело долшло на полный переход, то лучше всё написать вручную, удалив старый код. Где-то копируя, а где-то меняя вручную. Но если Вы думаете, что переход на Code First решит вашу проблему с последующей модификацие данных, то нет.
    • Предложено в качестве ответа YatajgaModerator 30 июля 2012 г. 10:33
    • Помечено в качестве ответа YatajgaModerator 4 августа 2012 г. 7:09
    28 июля 2012 г. 8:46
    Модератор