我一直试图弄清楚如何使用单个DBContext以Code First方式创建多个表而没有任何运气。我确定这只是我对框架的不熟悉,但我不确定我错过了什么。这是一个使用实体和DBContext的简单示例。
[Table("MyEntity")]
public class MyEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string MyColumn { get; set; }
public int MyNumber { get; set; }
}
[Table("MySecondEntity")]
public class MySecondEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string MyColumn { get; set; }
public int MyNumber { get; set; }
}
public class MyContext : DbContext
{
public DbSet<MyEntity> MyTable { get; set; }
public DbSet<MySecondEntity> MyTable2 { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = "test.db"};
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
optionsBuilder.UseSqlite(connection);
}
}
在我看来它应该可以正常工作,但是当我在下面的代码中调用它时,它就会出现一个没有这样的表:MyEntity&#39;点击第一个foreach循环时出现Sqlite异常。
static void Main(string[] args)
{
using (var db = new MyContext())
{
MyEntity testEntity1 = new MyEntity();
MySecondEntity entity1 = new MySecondEntity();
testEntity1.MyColumn = "Test Data 1";
testEntity1.MyNumber = 12345;
db.MyTable.Add(testEntity1);
db.Database.Migrate();
entity1.MyColumn = "New Data 1";
entity1.MyNumber = 2;
db.MyTable2.Add(entity1);
db.Database.Migrate();
Console.WriteLine("Inserting Data...");
Console.WriteLine("Data in the Database");
foreach (var entity in db.MyTable)
{
Console.WriteLine("Id: " + entity.Id);
Console.WriteLine("Column Data: " + entity.MyColumn);
Console.WriteLine("Number: " + entity.MyNumber);
}
foreach (var entity in db.MyTable2)
{
Console.WriteLine("Id: " + entity.Id);
Console.WriteLine("Column Data: " + entity.MyColumn);
Console.WriteLine("Number: " + entity.MyNumber);
}
}
Console.WriteLine("Examples run finished,press Enter to continue...");
Console.ReadLine();
}
我几乎可以保证它很简单,但我似乎无法找到它,而且我的文档中没有任何可以找到的例子。似乎有一个类似的问题在GitHub上提交https://github.com/aspnet/EntityFramework/issues/2874,但这是针对多个上下文的问题。那么也许这是另一件尚未发布的作品呢?
解决方案
按照@ http://ef.readthedocs.org/en/latest/getting-started/uwp.html发布的教程,按照@natemcmaster的建议和@ lukas-kabrt推荐的解决方案,我能够按照需要使其工作。通过运行以下命令,我能够创建表并从中插入/选择数据。
Install-Package EntityFramework.Commands –Pre
Add-Migration MyFirstMigration
Update-Database
答案 0 :(得分:4)
在官方文档中查看Getting Started on UWP - EF 7。以下注释来自该文件。
UWP上的默认路径不可写。您的数据库文件需要位于ApplicationData.Current.LocalFolder
options.UseSqlite("Data Source=" + Path.Combine(ApplicationData.Current.LocalFolder.Path, "blogging.db"))
另外,请注意,在UWP上,您无法从命令运行迁移。您需要在应用程序中运行它们。
using (var db = new BloggingContext())
{
db.Database.Migrate();
}
答案 1 :(得分:3)
DbContext
类包含数据库的配置 - 表,关系等。要使用DbContext
,您需要创建一个与DbContext
匹配的数据库。在Code-first世界中,它是通过数据库迁移完成的。
对于 ASP.NET 5 ,您需要将此配置添加到project.json
文件
"commands": {
"ef": "EntityFramework.Commands"
}
然后向项目添加迁移,并通过运行以下命令将此迁移应用于DB
dnx ef migrations add MyFirstMigration
dnx ef database update
对于完整版.NET ,您需要在程序包管理器控制台中运行以下命令(工具‣NuGet程序包管理器‣程序包管理器控制台)
Install-Package EntityFramework.Commands –Pre
Add-Migration MyFirstMigration
Update-Database