从对象,entity framework自动创建数据库表

我正在尝试这个教程http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs但不是使用紧凑版的SQL Server我在本地计算机上使用完整安装。 我阅读本教程的方式是entity framework假设从我定义的对象创建表。 我的问题是,当我运行项目时,我一直收到无效的对象名称dbo.movi​​es。 我终于通过自己创建表来运行它,所以我知道连接字符串,一切都是正确的。

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

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

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

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

Database.SetInitializer(new DropCreateDatabaseAlways()); 

一旦运行,我建议将该行更改为:

 Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); 

这些名称空间在System.Data.Entity中定义

DbContext类还公开了一个Database属性,该属性定义了以下有用的方法:

 Delete() Create() CreateIfNotExists() 

所以如果你这样定义你的类:

 public class MyContext : DbContext {} 

你可以像这样构造一个实例:

 MyContext db = new MyContext(); db.Database.Delete(); db.Database.Create(); 
 ModelContext.Database.EnsureCreated(); 

如果您创建Linq-to-Sql DataContext,则可以将结构直接注入到数据库中:

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

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

删除此表后,EF将重新创建表,而无需重新创建数据库。

这在生产中可能不是一种可行的方法,但是对于我的开发需求,这解决了我的问题。 也许它会帮助别人。

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

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

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

 var repo = new FenixRepositoryCreateTable(); //or repo = new FenixRepository(); repo.CreateTable(); 

此外,如果您的表在几次迁移之间传播并且它们没有与其他表相对应的东西,您可以通过FenixAttribute指定这些迁移(即Migrations文件夹中的类的名称),并且它们将被用作SQL脚本的源,这将是用于表创建:

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

如果没有此属性,库将使用默认脚本。 指定迁移总是更好,因为否则无法保证将创建所有索引,并且还可以在迁移中包含一些自定义代码,这些代码在默认解决方案时不会执行。

在MS SQL的情况下,库与EF 6.1.3兼容并进行了测试。