实体框架7和SQLite多个上下文错误

时间:2015-11-02 21:11:14

标签: c# entity-framework sqlite

所以我正在开发一个使用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'

我没有看到除了名称之外的两个实体类之间有什么不同,这些名称表明它无法创建第二个表的问题。每个上下文是否需要指向唯一的数据源?

1 个答案:

答案 0 :(得分:2)

您必须使用迁移。确保创建仅用于测试