[英]How can I query Sqlite in Xamarin using Entity Framework?
我在使用Sqlite和EF插件(Microsoft.Enttityframeworkcore.sqlite)的Xamarin.Forms項目(C#)中。 發生什么取決於:
場景1:我使用“Database.EnsureDeletedAsync”
場景2:我不使用“Database.EnsureDeletedAsync”
在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.