Windows 10 uwp - 实体核心Sqlite:包含查询错误

时间:2017-03-09 15:44:14

标签: c# entity-framework linq sqlite uwp

在Windows 10 UWP应用程序中,我正在使用带有Entity Framework Core 1.1的本地sqlite数据库,它现在正常工作,除此之外:

我正在尝试使用简单的linq查询将相关对象包含到我的用户对象中。我测试了一些查询,但是包含方法和选择限制的lambdas无效。

代码示例:

public async Task<IUser> GetAsync(Guid id)
{
    // Working, but useless
    var user = await this.DbSet.Include(u => u.ProfileNavigation).FirstOrDefaultAsync();

    // Returns null
    var user1 = await this.DbSet.Include(u => u.ProfileNavigation).FirstOrDefaultAsync(u => u.IdGuid == id);

    // Returns null
    var user2 = await this.DbSet.Where(u => u.IdGuid == id).Include(u => u.ProfileNavigation).FirstOrDefaultAsync();

    // Returns null linked object
    User user3 = await this.DbSet.SingleOrDefaultAsync(u => u.IdGuid == id);
    await this.Context.Entry(user3).Reference(p => p.ProfileNavigation).LoadAsync();

    // Result valid but painfull
    User res = await (from u in this.DbSet
                      join p in this.Context.Set<Profile>() on u.ProfileGuid equals p.IdGuid
                      where u.IdGuid == id
                      select new User
                      {
                          Id = u.Id,
                          ProfileId = u.ProfileId,
                          ManagerUserId = u.ManagerUserId,
                          RegionId = u.RegionId,
                          Number = u.Number,
                          Password = u.Password,
                          FirstName = u.FirstName,
                          LastName = u.LastName,
                          Email = u.Email,
                          HideOnBoardAppConstr = u.HideOnBoardAppConstr,
                          ModifiedByUserId = u.ModifiedByUserId,
                          ProfileNavigation = p
                      }).FirstOrDefaultAsync();

    return res;
}

有没有人有这个问题并解决了它?

提前致谢。

2 个答案:

答案 0 :(得分:0)

有一份关于create Database by the Entity Framework的官方文件。

  

在本演练中,您将构建一个通用Windows平台(UWP)应用程序,该应用程序使用Entity Framework对本地SQLite数据库执行基本数据访问。

您应该能够检查包含BlogPost类的BloggingContext类是否为样本。

还有Entity Framework Loading Related Entities的文档。

  

预先加载是一种过程,即对一种类型的实体的查询也会将相关实体作为查询的一部分加载。通过使用Include方法实现预先加载。例如,下面的查询将加载博客以及与每个博客相关的所有帖子。

例如:

BloggingContext类:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=blogging.db");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

包含查询代码:

using (var db = new BloggingContext())
{
    var blogs1 = db.Blogs.Include(b => b.Posts).ToList();
}

答案 1 :(得分:0)

通过为每个请求使用数据库上下文实例可以部分解决此问题。问题与上下文的依赖注入有关(我尝试使用SimpleIoc和Microsoft.Extensions.DependencyInjection),但它仍然让我感到困惑。

欢迎任何评论。