Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework Can';t首先获取EF 6代码以创建表_Entity Framework_Ef Code First_Entity Framework 6 - Fatal编程技术网

Entity framework Can';t首先获取EF 6代码以创建表

Entity framework Can';t首先获取EF 6代码以创建表,entity-framework,ef-code-first,entity-framework-6,Entity Framework,Ef Code First,Entity Framework 6,我已经有一个数据库,其中的表不在EF范围内。但我希望EF将使用的表能够自动创建 public class SessionInfo { public Guid Id {get;set;} public string Name { get; set; } public DateTime StartsOn { get; set; } public DateTime EndsOn { get; set; } public string Notes { get; s

我已经有一个数据库,其中的表不在EF范围内。但我希望EF将使用的表能够自动创建

public class SessionInfo
{
    public Guid Id {get;set;}
    public string Name { get; set; }
    public DateTime StartsOn { get; set; }
    public DateTime EndsOn { get; set; }
    public string Notes { get; set; }
}

public class StudentsDbContext:DbContext
{
    public StudentsDbContext():base("name=memory")

    {
        Database.Log = s => this.LogDebug(s);         

    }

    public DbSet<SessionInfo> Sessions { get; set; }
}
我需要做什么才能让EF自己创建“SessionInfo”(无论名称如何,都不重要)表?我的印象是,当上下文首次用于更改或查询时,Ef将创建表

更新


经过一些挖掘,似乎EF和Sqlite在一起玩得不太好,即最多可以使用EF进行查询,但仅此而已。不创建表,不添加实体

EF需要额外的信息才能做到这一点。您必须首先指定
IDatabaseInitializer
。请查看并找到一个适合您需要的版本(例如:MigrateDatabaseTolatesVersion、DropCreateDatabaseAlways、DropCreateDatabaseIfModelChanges等)

然后创建您的类:

public class MyDatabaseInitializer : MigrateDatabaseToLatestVersion
  <MyDbContext,
   MyDatabaseMigrationConfiguration>
公共类MyDatabaseInitializer:MigratedDatabaseToLateStVersion
然后还要为初始值设定项创建配置(对吗?):

公共类数据库迁移配置
:dbmigrations配置
{
公共数据库迁移配置()
{
this.AutomaticMigrationDataLossAllowed=true;
this.AutomaticMigrationsEnabled=true;
}
受保护的覆盖无效种子(MyDbContext上下文)
{
//需要自动向数据库添加/更新数据
//在初始化期间?
种子(上下文);
}
}
然后,初始化数据库的一种方法是:

var myContext = new MyDbContext(/*connectionString*/);

Database.SetInitializer<MyDbContext>(new MyDatabaseInitializer());
myContext.Database.Initialize(true);
var myContext=newmydbcontext(/*connectionString*/);
SetInitializer(新的MyDatabaseInitializer());
myContext.Database.Initialize(true);

有些人喜欢使用to,但我不想假设我总是可以通过命令lin访问数据库。

因此,即使我没有要设定的值,我也必须给它一个初始值设定项?基本上,我需要创建两个类MyDatabaseInitializer和MyDatabaseMigrationConfiguration(没有行为),以便Ef创建上下文的表?我的意思是,我需要这些类来让EF触发表的创建?这是一种方法。这就是我提到的命令行,这就是方法。在任何情况下,必须发生的真正事情是调用
Context.Database.Initialize()
weither您、命令行或包管理器必须调用它。遗憾的是,它不适用于迁移,因为我使用的是SQLite,它需要一个SQLite迁移器。使用drop数据库的任何内容都不起作用,因为提供程序不支持它。。。。我想我将只是“手动”创建表,而不是使用EF。谢谢你的帮助。谁知道让EF基本上创建一个表是如此复杂。这就是为什么它如此复杂的原因,因为微软没有创建所有数据库服务器的所有DAO提供程序。不可能总是知道外部DAO提供程序提供了什么。您可以生成一个EDMX,请参阅我对类似问题的回答:
public  class DatabaseMigrationsConfiguration 
  : DbMigrationsConfiguration<MyDbContext>
{
    public DatabaseMigrationsConfiguration()
    {
        this.AutomaticMigrationDataLossAllowed = true;
        this.AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Need data automagically added/update to the DB
        // during initialization?

        base.Seed(context);
    }
}
var myContext = new MyDbContext(/*connectionString*/);

Database.SetInitializer<MyDbContext>(new MyDatabaseInitializer());
myContext.Database.Initialize(true);