我不能相信我是第一个遇到这个问题的人,但我没有在网上找到任何类似的讨论。
这是简单的完整代码示例:
using SQLite.CodeFirst;
using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Entity entity = new Entity();
Guid id = entity.Id;
using (var context = new MyDbContext())
{
context.Entities.Add(entity);
context.SaveChanges();
// this finds an entry
var item = context.Entities.Find(id);
}
using (var context = new MyDbContext())
{
// here it returns null
var item = context.Entities.Find(id);
}
}
}
public class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new SqliteDropCreateDatabaseWhenModelChanges<MyDbContext>(modelBuilder));
}
public MyDbContext() : base("MyConnection") {}
public DbSet<Entity> Entities { get; set; }
}
public class Entity
{
[Key]
public Guid Id { get; set; } = Guid.Parse("D46D98F3-C262-468A-9C28-83D81080CF18");
public string Name { get; set; } = "Test";
}
}
问题在代码中标出。第一个“查找”返回新添加的条目。
但是获取上下文的新实例时,找不到该条目。
甚至,如果我第二次运行该应用程序,跳过将条目添加到表中的代码,它也不会找到该项目。问题似乎不是“Find”方法,因为我已经尝试了其他几个 linq 语句,结果相同。
当我在搜索之前首先从表中获取所有项目时,它可以使用“查找”,但不能使用 linq。
这是示例:
using (var context = new MyDbContext())
{
// this returns all items
var allItems = context.Entities.ToArrayAsync().Result;
// this finds the item
var item1 = context.Entities.Find(id);
// this doesn't find the item
var item2 = context.Entities.Where(x => x.Id == id).FirstOrDefault();
}
using (var context = new MyDbContext())
{
// this doesn't find the item
var item1 = context.Entities.Find(id);
// this also doesn't find the item
var item2 = context.Entities.Where(x => x.Id == id).FirstOrDefault();
}
谁有解释吗?将键更改为字符串或整数而不是 GUID,它按预期工作。
最佳答案
bug 上的链接给了我使用连接字符串添加“Binary UUID=True;”的想法。
而且它按预期工作。谢谢。
关于c# - SQLite 和 EF6 的愚蠢行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59101016/