2012-03-26 117 views
10

我正在尝试执行本教程http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs,而不是使用精简版的SQL Server,我在本地机器上使用完整安装。我阅读本教程的方式是实体框架假设从我定义的对象中创建表。我的问题是,当我运行该项目时,我不断收到无效的对象名称dbo.movi​​es。我终于通过自己创建表来运行它,所以我知道连接字符串,并且一切都是正确的。从对象,实体框架自动创建数据库表

我的问题是,是否有可能从C#中创建的对象生成表,如果是这样的话?

回答

19

是否有可能从C#中创建的对象生成表?

是的,这是可能的。在运行代码之前,您是否碰巧在Management Studio中手动创建数据库?这可能是你的问题。使用Code First时,默认约定是创建数据库,如果数据库不存在。如果数据库已经存在(即使没有表),那么它将只使用现有的数据库(但不会尝试创建表)。

您可以删除数据库并再次尝试运行代码,看它是否会为您创建它或将在Global.asax中以下行:

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>()); 

一旦它运行的话,我会建议改变该行:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContextHere>()); 

这些命名空间是在System.Data.Entity

定义的DbContext类也公开了一个数据基础属性,它定义了以下有用的方法:

Delete() 
Create() 
CreateIfNotExists() 

所以,如果你确定你的类像这样:

public class MyContext : DbContext {} 

您可以构建一个实例,像这样:

MyContext db = new MyContext(); 
db.Database.Delete(); 
db.Database.Create(); 
+0

嗯,我想如果没有初始数据库连接到连接字符串,我想什么?我只是从它删除最初的目录片断并收到相同的无效对象名称'dbo.Movies'错误。 – Pieces 2012-03-26 14:31:46

+0

连接字符串告诉它在哪里创建数据库。它不一定存在。它会检测到它不存在,然后尝试创建它,如果它不存在。只要它具有正确的权限,一切都会创建正常。我想如果你删除数据库并保留相同的连接字符串,那么一切都将以你想要的方式工作。 – Dismissile 2012-03-26 14:33:23

+0

哦,非常感谢你!最后一个问题是,您建议将Database.SetInitializer放在哪个方法中。我得到一个错误,它无法删除数据库,因为它正在使用中。我会通过应用程序来推测它的自我。再次感谢,我的朋友和我花了很多时间寻找解决问题的方法,并且从来不会猜测数据库不应该被创建。 – Pieces 2012-03-26 14:38:07

0

如果创建一个Linq到SQL的DataContext,您可以直接将结构注入数据库蒙山:

DbDataContext db = new DbDataContext(connectionString); 
db.CreateDatabase(); 
+1

他正在使用实体框架DbContext,而不是Linq-to-SQL – Dismissile 2012-03-26 14:37:43

0

我不知道这是否是犹太教,但使用代码优先的EF,当我使用AddRange时,EF通常会创建我定义的所有表。我想保留数据库,因为我想在应用程序运行之间保留其他表。我发现如果我没有删除创建名为__MigrationHistory的表EF,它们在被删除后不会被重新创建。

一旦我删除了这个表,那么EF将重新创建表而不必重新创建数据库。

这可能不是一个明智的生产方式,但对于我的发展需要,这解决了我的问题。也许它会帮助别人。

0

您可以使用FenixRepo库(也可作为nuget package)创建特定的表格,这是您的一部分Context。首先,您应该在启动时调用一次staticInitialize方法,其中第一个参数是工厂方法,它返回您的Context的实例,第二个参数是Configurationclass的实例。它将为您的所有表格准备SQL脚本,在Context处注册。在ASP.NET MVC的情况下,它是一个很好的决定,将此代码粘贴到Global.asax中:

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration()); 

然后你就可以创建所需的类型MyTable这种简单的方式表:

var repo = new FenixRepositoryCreateTable<MyTable>(); 
//or repo = new FenixRepository<MyTable>(); 

repo.CreateTable(); 

而且,如果你的表格在多个迁移之间传播,并且他们没有任何东西与其他表格相对应,则可以通过FenixAttribute指定这些迁移(即迁移文件夹中的类别名称),并且它们将被用作SQL脚本的来源,用于创建表格:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))] 
public class MyTable 
{ 
    //some stuff 
} 

没有此属性,库将使用默认脚本。指定迁移总是比较好,因为否则不能保证所有索引都将创建,并且在迁移过程中,您可以包含一些自定义代码,在默认解决方案的情况下不会执行。

库在MS SQL的情况下与EF 6.1.3兼容和测试。

-1
ModelContext.Database.EnsureCreated(); 
+0

请解释你的问题。 – 2018-01-06 13:45:35

相关问题