簡體   English   中英

如何使用Entity Framework在Xamarin中查詢Sqlite?

[英]How can I query Sqlite in Xamarin using Entity Framework?

我在使用Sqlite和EF插件(Microsoft.Enttityframeworkcore.sqlite)的Xamarin.Forms項目(C#)中。 發生什么取決於:

場景1:我使用“Database.EnsureDeletedAsync”

  • 我可以把數據放到DB中
  • 在同一個“using”語句和“dbContext”對象中,我可以使用LINQ查詢檢索數據沒有錯誤。

場景2:我不使用“Database.EnsureDeletedAsync”

  • 數據庫已經存在
  • 我可以添加數據
  • 在同一個“using”語句和“dbContext”對象中,任何使用LINQ查詢檢索數據的嘗試(我嘗試了多種方式),都會導致錯誤(System.NullReferenceException:對象引用未設置為對象的實例) 。

在BOTH場景中,我能夠ADB從Android模擬器中提取數據並進行驗證

1)數據庫存在,2)我的數據進入它。

僅供參考 - 驗證DbPath是否正確(同樣,我可以拉動DB並查看其中的數據)。

// 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();
}

我添加了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上下文:

  // 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.問題可能是由異步方法引起的。

問題解決了! 結果是dbContext以及定義的方式/位置與嘗試使用的位置。 代碼已重新構建,以確保在執行讀取和寫入之前不會丟失上下文范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM