所以我正在开发一个使用Entity Framework 7和SQLite来存储各种数据的应用程序。我遇到的问题是EF没有在test.db文件中创建第二个表。我有预感,因为两个上下文都将数据源设置为test.db
var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = "test.db"};
我不确定这是否会导致问题,因为我不熟悉EF或SQLite,这是我使用过的第一个ORM。下面我有两个示例enity和它们各自的上下文。
[Table("MyEntity")]
public class MyEntity
{
[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; }
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);
}
}
[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 MySecondContext : DbContext
{
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);
}
}
这两个实体及其上下文位于单独的C#文件中。这两个都在Program.cs中被引用。您可以在下面找到我的Program.cs文件中的代码。
static void Main(string[] args)
{
using (var db = new MyContext())
{
db.Database.EnsureCreated();
PopulateData(db);
CheckValues(db);
}
using (var db = new MySecondContext())
{
db.Database.EnsureCreated();
PopulateDataTwo(db);
CheckValuesTwo(db);
}
WaitForCompletion();
}
private static void PopulateData(MyContext db)
{
MyEntity testEntity1 = new MyEntity();
testEntity1.MyColumn = "Test Data 1";
testEntity1.MyNumber = 12345;
db.Add(testEntity1);
db.SaveChanges();
}
private static void PopulateDataTwo(MySecondContext db)
{
MySecondEntity entity1 = new MySecondEntity();
entity1.MyColumn = "New Data 1";
entity1.MyNumber = 2;
db.Add(entity1);
db.SaveChanges();
}
private static void CheckValues(MyContext db)
{
Console.WriteLine("Inserting Data...");
Console.WriteLine("Data in the Database");
foreach (var entity in db.MyTable)
{
WriteToConsole("Id: " + entity.Id);
WriteToConsole("Column Data: " + entity.MyColumn);
WriteToConsole("Number: " + entity.MyNumber);
}
}
private static void CheckValuesTwo(MySecondContext db)
{
Console.WriteLine("Inserting Data...");
Console.WriteLine("Data in the Database");
foreach (var entity in db.MyTable2)
{
WriteToConsole("Id: " + entity.Id);
WriteToConsole("Column Data: " + entity.MyColumn);
WriteToConsole("Number: " + entity.MyNumber);
}
}
public static void WriteToConsole(string msg)
{
Console.WriteLine(msg);
}
private static void WaitForCompletion()
{
WriteToConsole("Examples run finished,press Enter to continue...");
Console.ReadLine();
}
我有一种感觉,这只是一些简单的我缺少,当我运行此代码时,我得到以下错误。 db.SaveChanges();
中的PopulateDataTwo()
来电中发生错误。
消息=更新条目时发生错误。有关详细信息,请参阅内部异常 Message = SQLite错误1:'没有这样的表:MySecondEntity'
我没有看到除了名称之外的两个实体类之间有什么不同,这些名称表明它无法创建第二个表的问题。每个上下文是否需要指向唯一的数据源?
答案 0 :(得分:2)
您必须使用迁移。确保创建仅用于测试