我一直在使用Cosmos DB的实体框架核心连接器开发一个使用ASP.NET核心的应用程序。在很大程度上,这是一帆风顺的。现在,我想添加对从数据库中软删除记录的支持,使用我的应用程序查询DeletedAt属性,以确定是否在结果中包含实体。
我使用的是一个基本实体类型,我在其中添加了前面提到的时间戳:
public abstract class Entity
{
[Key]
public long Id { get; internal set; }
public DateTimeOffset CreatedAt { get; set; }
public DateTimeOffset? UpdatedAt { get; set; }
public DateTimeOffset? DeletedAt { get; set; }
}更新后的代码运行得很好。但是,我的数据库中确实有数千个实体没有定义DeletedAt属性。
我目前正在从一个通用的存储库类型执行查询,它执行类似以下内容的操作:
return await Queryable.Where(x => x.DeletedAt == null).Where(predicate).ToListAsync();这适用于定义了DeletedAt属性的新实体,但不包括所有未设置该属性的旧实体。我希望EF对未定义的属性采用默认值,但它似乎完全忽略了旧的实体。
通常,使用SQL Server时,我只需应用迁移并使用null DeletedAt时间戳对所有较旧的实体进行改造,这一切都很棒。然而,在Cosmos DB中,我不确定如何处理这种情况。我是否必须遍历所有较旧的实体并使用删除时间戳对其进行改造,或者是否有其他方法来处理丢失的更改实体和值?
谢谢!
发布于 2021-10-29 09:06:15
在Cosmos中,null和无值(undefined)是有区别的。在SQL query文本中,您可以使用以下内容来查询正在定义的属性(此外,您还可以向表达式添加null检查):
SELECT *
FROM c
WHERE NOT IS_DEFINED(c.example)对于带有linq的C# Cosmos SDK,您可以使用Microsoft.Azure.Cosmos.Linq并执行以下操作:
var qry = container.GetItemLinqQueryable<Item>()
.Where(x => !x.Example.IsDefined())
.ToFeedIterator();不幸的是,对于EF来说,到目前为止这似乎还不太可能。链接:
如果你想将它设置为null,你确实需要遍历所有的项目,并设置它,以便可以使用EF进行这样的查询。
发布于 2021-10-29 09:05:09
如果你正在使用Cosmos DB的.NET SDK,并因此使用它的反序列化(使用json.NET),那么如果你的模型类型有一个可以为空的属性,那么你不需要在CosmosDB文档中为该属性设置一个值。
它仍然是一个具有空值的.NET实例。
因此,可以使用应用程序代码中的空值轻松处理CosmosDB文档中的可选属性。
我将Cosmos DB的序列化选项设置为不保存空值,以避免将这些属性全部存储在一起。
https://stackoverflow.com/questions/69765713
复制相似问题