Entity Framework 4.1 - обмен базами данных - PullRequest
2 голосов
/ 01 июня 2011

Из всего, что я прочитал, EntityFramework должен быть коленями пчел, которые вы можете использовать CodeFirst для генерации сущностей из POCO.Потрясающие!Я сделал это, я позволил поведению по умолчанию EntityFramework сделать свое дело, и теперь я застрял спиной к стене.

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

У меня есть очень простой контекстный класс БД:

namespace AwesomeApp.Models
{
    public class MyContext : DbContext
    {
        public DbSet<Sneeze> Sneeze { get; set; }
    }
}

После того, как я провел несколько спринтов по установке модели на место, работая с контроллером и представлениями,Я готов перейти на промежуточную среду с использованием SQLServer Express 2008. Итак, я спросил г-на google, как это сделать, и в этом посте прямо говорится, что вы устанавливаете строку подключения с контекстом сущности в качестве имени, все остальное должновстать на место.

<connectionStrings>
<add name="MyContext"
     connectionString="Server=server;Database=awesome_sauce;User ID=noob;Password=noob;Trusted_Connection=False;"
     providerName="System.Data.SqlClient"/>

Я называю shenanigans, поскольку она не создает таблицы в базе данных, которую я перечислил, и все еще имеет доступ к базе данных по умолчанию.Это оставляет мне две проблемы, и я уверен, что это связано с моим незнанием

  1. Где находится база данных по умолчанию для SQL Server Express (или это CE), которую Entity Framework вызывает по умолчанию?
  2. Когда вы обновляете соединение, требуется ли программисту больше взаимодействия для достижения достигнутого поведения при обмене БД?

Ответы [ 2 ]

1 голос
/ 13 июля 2012
// for a website:
[assembly: System.Web.PreApplicationStartMethod(typeof  (MyContextNS.MyContextInitializer), "Application_Start")]
// or just call MyContextNS.MyContext.Application_Start(); before using MyContext
namespace MyContextNS
{   
    public class MyContextInitializer 
        : DropCreateDatabaseAlways<MyContext>
        // : DropCreateDatabaseIfModelChanges<MyContext>
    {
        public static void Application_Start() {
            var initializer = new MyContextInitializer();
            Database.SetInitializer<MyContext>(initializer);
        }
        protected override void Seed(MyContext context) {
            base.Seed(context);
            // ... initialize
        }
    }
}
1 голос
/ 01 июня 2011

Вот пример, который я делаю, используя БД SQLite для динамического изменения пути ... Та же логика может быть использована для любого SQL. Я поместил это в мой application.xaml моего WPF-приложения (поэтому, вероятно, поместил в ваш application_start)

' Application-level events, such as Startup, Exit, and DispatcherUnhandledException
' can be handled in this file.

Public Sub New()

    'Attempt to load the db file
    Dim dbFile As New IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory & "Files\database.s3db")

    'Loop till we get liteEntities
    For Each item As System.Configuration.ConnectionStringSettings In ConfigurationManager.ConnectionStrings
        If item.Name <> "liteEntities" Then Continue For

        'Allow us to update this ite
        Dim fi = GetType(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance Or BindingFlags.NonPublic)
        fi.SetValue(item, False)

        'Update it
        item.ConnectionString = Replace(item.ConnectionString, "C:\db\Files\database.s3db", dbFile.FullName)

    Next


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