【发布时间】: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 你能更新一下你目前使用的新代码吗?