我已经拥有一个包含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; }
}
此代码只会引发异常,因为表SessionInfoes不存在。
using (var db = new StudentsDbContext())
{
db.Sessions.Add(new SessionInfo() {Id = Guid.NewGuid(), Name = "bla"});
var st = db.Sessions.FirstOrDefault();
}
我需要做什么才能让EF创建&#34; SessionInfoes&#34; (无论名称,它不重要)表格本身?我的印象是,当首次使用上下文进行更改或查询时,Ef将创建表。
更新
经过一番挖掘后,似乎EF和Sqlite不能很好地在一起玩,但最多你可以使用EF来进行查询,但这就是它。没有表创建,没有添加实体。
答案 0 :(得分:1)
EF需要其他信息才能执行此操作。您必须先指定IDatabaseInitializer
。查看this list并找到一个适合您需求的文件(例如:MigrateDatabaseToLatestVersion,DropCreateDatabaseAlways,DropCreateDatabaseIfModelChanges等)。
然后创建你的课程:
public class MyDatabaseInitializer : MigrateDatabaseToLatestVersion
<MyDbContext,
MyDatabaseMigrationConfiguration>
然后还创建初始化程序的配置(对吧?):
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);
有些人更喜欢use the command line to migrate databases,但我不想假设我总是可以从命令lin访问数据库。