无法使用自定义数据库初始化程序
问题描述:
我正在构建一个用于管理库的简单MVC应用程序。出于开发目的,我希望EF在每次模型更改时都删除并重新创建数据库,并在其中填入一些示例数据。在这一刻,我努力让初始化工作。初始化类看起来是这样的:无法使用自定义数据库初始化程序
public class LibraryInitializer : DropCreateDatabaseIfModelChanges<LibraryContext>
{
protected override void Seed(LibraryContext context)
{
// sample data to be writted to the DB
}
}
和上下文类看起来是这样的:
public class LibraryContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Book> Books { get; set; }
public LibraryContext()
{
Database.SetInitializer<LibraryContext>(new LibraryInitializer());
}
}
这时我得到以下错误:
Member 'Database.SetInitializer(IDatabaseInitializer)' cannot be accessed with an instance reference; qualify it with a type name instead
根据现有的许多导游在Web上,这是使用初始化程序的方式,但我不知道为什么会出现此错误。 任何帮助将大大appraciated。 谢谢!
答
在C#
中,您不能从实例访问static
成员。您必须使用该类型的名称访问static
成员。使用完整的类型名称。
System.Data.Entity.Database.SetInitializer<LibraryContext>(new LibraryInitializer());
DbContext
具有Database
属性是System.Data.Entity.Database
类的一个实例。当您在DbContext
中编写Database
时,它指向该实例,并且由于您无法从实例中访问静态方法,因此会出错。
谢谢你的答案,这几乎解决了这个问题。那么,事情是,当我检查任何教程/博客文章解释如何构建初始化(不想指向任何特定的网站),他们没有实际显示完整的'System.Data.Entity.Database.SetInitializer ..名字。我的代码是否会强制使用它,或者它在任何地方都没有提及,因为“每个人都应该知道这一点”? – Dandry
我最近遇到了同样的问题,并且我的数据库类位于名为Database的文件夹中,导致名称空间看起来像MyService.Database。在这种情况下,我必须完全指定System.Data.Entity.Database否则,你不必这样做。 – Anansi
你需要使用System.Data.Entity添加;放入您的使用说明中 - 否则它会尝试使用DbContext类的Database属性,因为它找不到该类。 – DevilSuichiro