如何使用实体框架在Xamarin中查询Sqlite?

时间:2019-04-12 15:37:43

标签: c# sqlite xamarin.forms entity-framework-6

我正在使用Sqlite和EF插件(Microsoft.Enttityframeworkcore.sqlite)的Xamarin.Forms项目(C#)。发生什么情况取决于:

方案1:我使用“ Database.EnsureDeletedAsync”

  • 我可以将数据放入数据库
  • 在相同的“ using”语句和“ dbContext”对象中,我可以使用LINQ查询检索数据而没有错误。

方案2:我不使用“ Database.EnsureDeletedAsync”

  • 数据库已经存在
  • 我可以向其中添加数据
  • 在同一“ using”语句和“ dbContext”对象中,任何使用LINQ查询检索数据的尝试(我已经尝试了多次 方式),导致错误(System.NullReferenceException:对象 引用未设置为对象的实例)。

在两种情况下,我都可以ADB从Android模拟器中提取数据库并进行验证

1)数据库存在并且 2)我的数据正在处理中。

仅供参考-DbPath已验证正确(再次,我可以拉出数据库并查看其中的数据)。

// POCO class

public class Participant
{
        [Key]
        public int Id { get; set; }
        public string Fname { get; set; }
}


// DB Context

public class DatabaseContext : DbContext
{
        string _dbPath;

        public DbSet<Participant> Participants { get; set; }

        public DatabaseContext(string dbPath)
        {
            _dbPath = dbPath;

            //Database.EnsureDeletedAsync();
            //Database.EnsureCreatedAsync();
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite($"Filename={_dbPath}");
        }
}


// Main page code-behind

InitializeComponent ();

// Create Database & Tables
using (var db = new DatabaseContext(App.DbPath))
{
    // Insert Data
    db.Add(new Participant() { Fname = "time: " + DateTime.Now.ToString() });
    db.SaveChanges();

    // Retrieve Data
    // Next two lines receive error in scenario 2
    var result2 = db.Participants.Where(xyz => xyz.Id == 1).ToList();
    IEnumerable<Participant> p = db.Participants.ToList();
}

2 个答案:

答案 0 :(得分:0)

在您更新数据之前,我添加了db.Database.EnsureCreated();

public MainPage()
{
    InitializeComponent();

    //iOS
    var dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library", "iOSTest.db");

    // Android
    var dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "AndroidTest.db");



    // Create Database & Tables
    using (var db = new DatabaseContext(dbPath))
    {

        db.Database.EnsureCreated();

        // Insert Data
        db.Add(new Participant() { Fname = "time: " + DateTime.Now.ToString() });
        db.SaveChanges();

        // Retrieve Data
        // Next two lines receive error in scenario 2
        var result2 = db.Participants.Where(xyz => xyz.Id == 1).ToList();
        IEnumerable<Participant> p = db.Participants.ToList();
    }
}

和数据库上下文:

  // DB Context

    public class DatabaseContext : DbContext
    {
        string _dbPath;

        public DbSet<Participant> Participants { get; set; }

        public DatabaseContext(string dbPath)
        {
            _dbPath = dbPath;

        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite($"Filename={_dbPath}");
        }
    }

1。您可以尝试更改项目中的数据库名称,以检查旧数据库中是否有任何错误的数据。 2.问题可能是由异步方法引起的。

答案 1 :(得分:0)

问题解决了!原来是dbContext以及定义的方式/位置与尝试使用的位置。代码已经过重组,以确保在执行读写之前不会丢失上下文范围。