从对象,实体框架自动创建数据库表
我正在尝试执行本教程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中手动创建数据库?这可能是你的问题。使用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();
如果创建一个Linq到SQL的DataContext,您可以直接将结构注入数据库蒙山:
DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();
他正在使用实体框架DbContext,而不是Linq-to-SQL – Dismissile 2012-03-26 14:37:43
我不知道这是否是犹太教,但使用代码优先的EF,当我使用AddRange时,EF通常会创建我定义的所有表。我想保留数据库,因为我想在应用程序运行之间保留其他表。我发现如果我没有删除创建名为__MigrationHistory的表EF,它们在被删除后不会被重新创建。
一旦我删除了这个表,那么EF将重新创建表而不必重新创建数据库。
这可能不是一个明智的生产方式,但对于我的发展需要,这解决了我的问题。也许它会帮助别人。
您可以使用FenixRepo库(也可作为nuget package)创建特定的表格,这是您的一部分Context
。首先,您应该在启动时调用一次static
Initialize
方法,其中第一个参数是工厂方法,它返回您的Context
的实例,第二个参数是Configuration
class
的实例。它将为您的所有表格准备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兼容和测试。
ModelContext.Database.EnsureCreated();
请解释你的问题。 – 2018-01-06 13:45:35
嗯,我想如果没有初始数据库连接到连接字符串,我想什么?我只是从它删除最初的目录片断并收到相同的无效对象名称'dbo.Movies'错误。 – Pieces 2012-03-26 14:31:46
连接字符串告诉它在哪里创建数据库。它不一定存在。它会检测到它不存在,然后尝试创建它,如果它不存在。只要它具有正确的权限,一切都会创建正常。我想如果你删除数据库并保留相同的连接字符串,那么一切都将以你想要的方式工作。 – Dismissile 2012-03-26 14:33:23
哦,非常感谢你!最后一个问题是,您建议将Database.SetInitializer放在哪个方法中。我得到一个错误,它无法删除数据库,因为它正在使用中。我会通过应用程序来推测它的自我。再次感谢,我的朋友和我花了很多时间寻找解决问题的方法,并且从来不会猜测数据库不应该被创建。 – Pieces 2012-03-26 14:38:07