无法使用自定义数据库初始化程序

问题描述:

我正在构建一个用于管理库的简单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时,它指向该实例,并且由于您无法从实例中访问静态方法,因此会出错。

+0

谢谢你的答案,这几乎解决了这个问题。那么,事情是,当我检查任何教程/博客文章解释如何构建初始化(不想指向任何特定的网站),他们没有实际显示完整的'System.Data.Entity.Database.SetInitializer ..名字。我的代码是否会强制使用它,或者它在任何地方都没有提及,因为“每个人都应该知道这一点”? – Dandry

+2

我最近遇到了同样的问题,并且我的数据库类位于名为Database的文件夹中,导致名称空间看起来像MyService.Database。在这种情况下,我必须完全指定System.Data.Entity.Database否则,你不必这样做。 – Anansi

+0

你需要使用System.Data.Entity添加;放入您的使用说明中 - 否则它会尝试使用DbContext类的Database属性,因为它找不到该类。 – DevilSuichiro