我正在使用Sqlite和EF插件(Microsoft.Enttityframeworkcore.sqlite)的Xamarin.Forms项目(C#)。发生什么情况取决于:
方案1:我使用“ Database.EnsureDeletedAsync”
方案2:我不使用“ Database.EnsureDeletedAsync”
在两种情况下,我都可以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();
}
答案 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以及定义的方式/位置与尝试使用的位置。代码已经过重组,以确保在执行读写之前不会丢失上下文范围。