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

本文关键字:创建 数据库 框架 对象 实体 | 更新日期: 2023-09-27 18:29:12

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

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

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

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

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

您可以删除数据库,然后再次尝试运行代码,看看它是否会为您创建它,或者在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();
ModelContext.Database.EnsureCreated();

如果您创建了一个从Linq到Sql的DataContext,您可以将该结构直接注入您的数据库whith:

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

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

一旦我删除了这个表,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<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兼容并进行了测试。