【问题标题】:List mapping manually手动列出映射
【发布时间】:2021-06-21 04:45:02
【问题描述】:

当我们的数据库通过添加新属性/列来更新时,我遇到了问题。

我的第一步是更新我的 POCO。在本例中为“NewProp”。我第一次调用或从数据库中读取时,它会返回一个错误“可为空的对象必须返回一个值”。因为我的班级期待来自数据库的“NewProp”...

我的解决方案是更新每个文档以包含“NewProp”.. 然后我编写了一个迭代每一行的脚本。手动映射(某种忽略)“新”属性,如下所示:

var items = await _context.Student
                 .Where(x => !x.IsDeleted)
                 .Select(x => new Domain.Entities.Student
                 {
                     Id = x.Id,
                     ProfId = x.ProfId,
                     NewProp = 0
                 )
                 .AsNoTracking()
                 .ToListAsync(cancellationToken);

然后遍历项目并更新每一行以将默认值添加到 NewProp。

现在我的问题是当一个新属性在一个列表中时。在这个例子中,一个新的道具在列表中。

问题:如何手动投影Subject?

这是我的课程

public class Student
{
    public string Id { get; set; }
    public string ProfId { get; set; }
    public List<SubjectDTO> Subjects { get; set; }
}

public class SubjectDTO
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int NewProp { get; set; } //Error mapping this
}


var items = await _context.Student
                     .Where(x => !x.IsDeleted)
                     .Select(x => new Domain.Entities.Student
                     {
                         Id = x.Id,
                         ProfId = x.ProfId,

                         //I dont know how to map or project manually
                         Subjects = x.Subjects.Select(z =>
                             new List<Subject>
                             {
                                new Subject
                                {
                                  Id = "test", // how to get value
                                  Name = "abc", // how to get value
                                  NewProp = 100,
                                }
                             }
                         )
                     )
                     .AsNoTracking()
                     .ToListAsync(cancellationToken);

顺便说一句,我正在使用 cosmosDB。

下面的编辑错误

var items = await _context.Student
                  .Select(x => new Domain.Entities.Student
                  {
                       id = x.id,
                       ProfId = x.ProfId,
                       Subjects = x.Subjects.Select(z => new Subject
                       {
                           id = z.id,
                           Name = z.Name,
                           NewProp = 0
                       }).ToList()
                    }).ToListAsync(cancellationToken); 

System.InvalidOperationException: Nullable object must have a value.

在 lambda_method29(闭包,JObject,Int32) 在 System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable1 source, Func3 选择器)+MoveNext() 在 Microsoft.EntityFrameworkCore.Cosmos.Query.Internal.CosmosShapedQueryCompilingExpressionVisitor.CosmosProjectionBindingRemovingExpressionVisitor.PopulateCollection[TEntity,TCollection](IClrCollectionAccessor 访问器,IEnumerable1 entities) at lambda_method28(Closure , QueryContext , JObject ) at Microsoft.EntityFrameworkCore.Cosmos.Query.Internal.CosmosShapedQueryCompilingExpressionVisitor.QueryingEnumerable1.AsyncEnumerator.MoveNextAsync() 在 Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1 source, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1 源,CancellationToken cancelToken)

【问题讨论】:

  • 您遇到什么错误?另外,您为什么要在您的选择语句中创建Subject 的列表而不仅仅是Subject
  • @GuruStron 在 Timur 的建议之后,我认为我已经解决了这个问题。因为这就是我的想法,通过手动映射不会有错误。由于缺少数据库列,我得到“可为空的对象必须有一个值”
  • 这应该确实有效。我现在会尝试重现它
  • @TimurUmerov 我更新了问题并发布了上面的错误。谢谢
  • @samantha07 你能更新一下你目前使用的新代码吗?

标签: c# linq


【解决方案1】:

这是你要找的吗?

.Select(x => new Domain.Entities.Student
{
     Id = x.Id,
     ProfId = x.ProfId,
     Subjects = x.Subjects.Select(z => new Subject
     {
         Id = z.Id,
         Name = z.Name,
         // map other properties
     }).ToList()
}).AsNoTracking() 
.ToListAsync()

您实际上不需要调用AsNoTracking(),因为您使用的是投影。基于投影的结果不受上下文跟踪

【讨论】:

  • 你是对的。谢谢你。我在我的这个问题上花费的时间比我应该花的更多。非常感谢!!!
  • 嗯,我仍然得到“可空对象必须有一个值”有什么想法吗?我已经手动映射了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2012-07-24
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多