c# - SQLite 和 EF6 的愚蠢行为

标签 c# entity-framework sqlite

我不能相信我是第一个遇到这个问题的人,但我没有在网上找到任何类似的讨论。

这是简单的完整代码示例:

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/

相关文章:

javascript - 如何在尝试使用 Razor Pages 删除 ASP.NET Core 中的记录时显示确认消息

c# - 编译器琐事 : What is consequence of this code

c# - 为什么在MVC中调用GetType Name得到的是一组数字?

android - 在 ListActivity 中加载 BIG SQLiteDatabase

c# - ASP.NET 无 Cookie session URL 问题仅在移动 safari 中

c# - Asp.Net MVC 使用参数执行 Oracle PL/SQL 存储过程

c# - 在 Entity Framework 中,当列定义为不可为空时,如何让存储过程返回可为空?

c# - Entity Framework和MVC在业务层或数据访问层创建DbContext

javascript - 使用可选参数运行LIKE查询-SQLite3

android - sqlcipher_export 没有导出我的表