从对象,实体框架自动创建数据库表

时间:2012-03-26 14:19:08

标签: c# sql asp.net-mvc entity-framework

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

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

5 个答案:

答案 0 :(得分:23)

  

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

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

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

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

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

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

这些名称空间在System.Data.Entity

中定义

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

Delete()
Create()
CreateIfNotExists()

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

public class MyContext : DbContext {}

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

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

答案 1 :(得分:1)

ModelContext.Database.EnsureCreated();

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

您可以使用FenixRepo库(也可用作nuget package)来创建特定的表,这是您Context的一部分。首先,你应该在启动static Initialize方法中调用一次,其中第一个参数是工厂方法,它返回Context的实例,第二个是实例Configuration class。它将为您在Context注册的所有表准备SQL脚本。在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指定这些迁移(即Migrations文件夹中的类名称),并且它们将被用作SQL脚本的源代码,将用于创建表:

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

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

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