Получить Entity Framework для генерации моих таблиц - PullRequest
0 голосов
/ 14 июля 2011

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

В моем Web.Config я установил строку подключения и указал на базу данных (без таблиц), которую я настроил:

    <connectionStrings>
    <add name="DataContext" connectionString="Server=.\SQLEXPRESS;Database=MyDatabase;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

В моем классе DataConext.cs, расположенном в моем проекте «Домен», у меня есть следующее: (я использую плагин Altairis.Web.Security для помощи в членстве)

public class DataContext : DbContext
{
    public DbSet<Faq> Faqs { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Maps to the expected many-to-many join table name for roles to users.
        modelBuilder.Entity<User>()
       .HasMany(u => u.Roles)
       .WithMany(r => r.Users)
       .Map(m =>
       {
           m.ToTable("RoleMemberships");
           m.MapLeftKey("UserName");
           m.MapRightKey("RoleName");
       });
    }
}

public class DataContextInitializer : CreateDatabaseIfNotExists<DataContext>
{
    protected override void Seed(DataContext context)
    {
        // create roles
        var roles = new List<Role>{
            new Role{RoleName = "Administrator"},   // admin area: admin user
            new Role{RoleName = "User"},            // admin area: normal user               
            new Role{RoleName = "Client"}           // front end: normal user
        };

        roles.ForEach(r => context.Roles.Add(r));
    }
}

В моем веб-проекте Global.asax.cs у меня есть:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Database.SetInitializer(new DataContextInitializer());
    }

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

Любая помощь, указывающая мне правильное направление, была бы великолепна! У меня это работало на моем домашнем компьютере, но запуск этого проекта на другом ПК просто почему-то не работает - типично;)

Спасибо, Рич

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Хорошо, наконец-то все заработало. Спасибо Ладиславу Мрнке за ссылку, которую я изменил в своем global.asax:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);


        var initr = new DataContextInitializer();
        Database.SetInitializer<DataContext>(new DataContextInitializer());
        using (var db = new DataContext())
        {
            db.Database.CreateIfNotExists();
        }

        using (var db1 = new DataContext())
        {
            initr.Seed(db1);
        }
    }

Я также настроил свой DataContextInitializer, используя предложение BumbleB2na. Готовый класс выглядит так:

public class DataContextInitializer : CreateDatabaseIfNotExists<DataContext>
{
    public void Seed(DataContext context)
    {
        // create roles
        var roles = new List<Role>{
            new Role{RoleName = "Administrator"},   // admin area: admin user
            new Role{RoleName = "User"},            // admin area: normal user               
            new Role{RoleName = "Client"}           // front end: normal user
        };

        roles.ForEach(r => context.Roles.Add(r));
        context.SaveChanges();
    }
}

Теперь это работает отлично, если я оставляю Entity Framework создавать базу данных для себя, а не Create самостоятельно, перед запуском кода. Надеюсь, это поможет кому-то еще!

0 голосов
/ 14 июля 2011

Я думаю, вам нужно использовать тип «DataContext», когда вы устанавливаете инициализатор:

Database.SetInitializer<DataContext>(new DataContextInitializer())

А когда вы заполняете данные таблицы, вам нужно сохранять изменения:

protected override void Seed(DataContext context)
{
    // create roles
    var roles = new List<Role>{
        new Role{RoleName = "Administrator"},   // admin area: admin user
        new Role{RoleName = "User"},            // admin area: normal user               
        new Role{RoleName = "Client"}           // front end: normal user
    };

    roles.ForEach(r => context.Roles.Add(r));
    context.SaveChanges();  // save changes to db
}
...