MVC 3 EF代码 - 首先到webhost数据库的麻烦

时间:2011-08-30 16:46:19

标签: c#-4.0 ef-code-first

我是ASP.NET MVC 3的新手,也是一般的编码。

我有一个非常小的应用程序,我想上传到我的虚拟主机域。

我正在使用实体框架,它在我的本地机器上运行良好。 我输入了一个新的连接字符串来使用我的远程数据库而不是它真的没有用,首先我有一个单独的MSSQL数据库,不能删除和重新创建,所以我不能在我的初始化程序中使用该策略,我试图在策略中提供null,但无济于事,我的表根本没有在我的数据库中创建,这就是问题,我不知道我是如何用实体框架来做的。

当我运行应用程序时,它会尝试从数据库中选择数据,该部分工作正常,我只是不知道如何通过codefirst在我的数据库中创建这些选项卡。

我可以通过手动重新创建表来实现它,但我想通过codefirst知道解决方案。

这是我的初始化类

public class EntityInit : DropCreateDatabaseIfModelChanges<NewsContext>
{
    private NewsContext _db = new NewsContext();


    protected override void Seed(NewsContext context)
    {
        new List<News>
        {
            new News{ Author="Michael Brandt", Title="Test News 1 ", NewsBody="Bblablabalblaaaaa1" },
            new News{ Author="Michael Brandt", Title="Test News 2 ", NewsBody="Bblablabalblaaaaa2" },
            new News{ Author="Michael Brandt", Title="Test News 3 ", NewsBody="Bblablabalblaaaaa3" },
            new News{ Author="Michael Brandt", Title="Test News 4 ", NewsBody="Bblablabalblaaaaa4" },
        }.ForEach(a => context.News.Add(a));


        base.Seed(context);
    }
}

正如我所说的,我对这一切都是新手,所以请原谅,如果我不能提供你需要的正确信息来回答我的问题,只有我知道,我会回答它

2 个答案:

答案 0 :(得分:2)

初始化策略目前不支持升级策略。

初始化策略应该用于初始化新数据库。所有后续更改都应该使用脚本来完成。

我们所说的最佳做法是使用脚本修改数据库,然后手动调整代码以反映此更改。

在将来的版本中,将提供升级/迁移策略。


尝试从自定义IDatabaseInitializer执行脚本语句语句 然后,您可以从中读取数据库中的数据库版本并将缺少的脚本应用于数据库。只需将db版本存储在表中。然后使用更改脚本升级。

public class Initializer : IDatabaseInitializer<MyContext>
        {
            public void InitializeDatabase(MyContext context)
            {
                if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false))
                {
                    context.Database.Delete();
                    context.Database.Create();
                    var jobInstanceStateList = EnumExtensions.ConvertEnumToDictionary<JobInstanceStateEnum>().ToList();
                    jobInstanceStateList.ForEach(kvp => context.JobInstanceStateLookup.Add(
                        new JobInstanceStateLookup()
                            {
                                JobInstanceStateLookupId = kvp.Value,
                                Value = kvp.Key
                            }));

                    context.SaveChanges();
                }          
            }
        }

您是否尝试过使用CreateDatabaseOnlyIfNotExists

- 每次初始化上下文时,如果数据库不存在,将重新创建数据库。

可以使用Database类的SetInitializer方法设置数据库初始化程序。如果未指定任何内容,则将使用CreateDatabaseOnlyIfNotExists类初始化数据库。

Database.SetInitializer(null);

-

Database.SetInitializer<NewsContext>(new CreateDatabaseOnlyIfNotExists<NewsContext>());

我不确定这是否是确切的语法,因为我暂时没有写这篇文章。但它应该非常相似。

答案 1 :(得分:0)

如果您使用的是非常小的应用程序,那么您可能会使用SQL CE 4.0。
即使您的提供程序没有为其安装二进制文件,bin部署也应该允许您运行SQL CE 4.0。你可以read more here

我们实际上可以使用您想要的任何初始化程序,因为您现在不会遇到无法删除数据库和删除表的问题。

可以this有任何帮助吗?