包含在Entity Framework和Cosmos DB中

时间:2019-11-19 16:13:30

标签: entity-framework .net-core azure-cosmosdb

我对Entity Framework和Cosmos DB有问题。

当我在这样的实体上使用.Include时:

 public async Task<People[]> GetAllPeopleAsync()
 { 
     IQueryable<People> query = _context.Peoples.Include(p => p.Info);
     return await query.ToArrayAsync();            
 }

我收到此错误:

  

Banco De dados Falhos LINQ表达式'LeftJoin,TransparentIdentifier>(外部:DbSet,内部:DbSet,           externalKeySelector:(p)=>属性>(p,“ Id”),           innerKeySelector:(i)=>属性>(i,“ PeopleId”),           resultSelector:(o,i)=>新的TransparentIdentifier(               外层= o,               内在=我           ))'无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。有关更多信息,请参见https://go.microsoft.com/fwlink/?linkid=2101038

保存数据可以像SQL一样正常工作

public void Add<T>(T entity) where T : class
{
     _context.Add(entity);
}

public async Task<bool> SaveChangesAsync()
{
     return (await _context.SaveChangesAsync()) > 0;
}

我的实体:

public class People
{
     public Guid Id { get; set; }
     public string Name { get; set; }
     public Info Info { get; set; }    
}

public class Info
{
     public Guid Id { get; set; }
     public string Street { get; set; }
     public string Number { get; set; }
     public Guid PeopleId { get; set; }
     public People People { get; }
}

为解决此问题,我制作了一个函数,用于从PeopleId获取信息,然后将其放入People,并根据需要进行工作:

public async Task<Info[]> GetInfoByPepleIdAsync(Guid guidPeople)
{ 
    IQueryable<Info> query = _context.Infos.Where(i => i.PeopleId == guidPeople);
    return await query.ToArrayAsync();
}

GetAllPeopleAsync函数如下所示:

public async Task<People[]> GetAllPeopleAsync()
{ 
   IQueryable<People> query = _context.Peoples;
   var Peoples = await query.ToArrayAsync();

   foreach(People p in Peoples) 
   {
       var Infos = await GetInfoByPepleIdAsync(p.Id);
       p.Info = Infos.FirstOrDefault();
   }

   return Peoples;            
 }

我想知道是否有任何方法可以像CosmosDB中的include那样使用?

如果没有等效的方法,则该方法可行,否则我会遇到性能问题或其他问题?

1 个答案:

答案 0 :(得分:0)

从2019年12月3日开始,EF Core Cosmos数据库提供程序不支持包含和加入。

https://docs.microsoft.com/en-us/ef/core/providers/cosmos/limitations

您可以在Github上跟踪未解决的问题,以查看是否/何时为EF Core 3.1实施了该问题。您甚至可以通过预览版获得早期访问权。 Include不是3.1发行的。您仍然可以在此处跟踪该功能的进度:

https://github.com/aspnet/EntityFrameworkCore/issues?page=1&q=is%3Aissue+is%3Aopen+Cosmos+in%3Atitle+label%3Atype-enhancement+sort%3Areactions-%2B1-desc

今年早些时候,朱莉·勒曼(Julie Lerman)发布了一个博客,大致显示了Include如何与Cosmos合作。如果实现类似于预览,则当EF推断上下文中实体之间存在图/节点样式关系时,EF将添加类似于外键的内容。

https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/january/data-points-a-peek-at-the-ef-core-cosmos-db-provider-preview