首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理Cosmos DB中的变更实体进行软删除?

如何处理Cosmos DB中的变更实体进行软删除?
EN

Stack Overflow用户
提问于 2021-10-29 08:20:39
回答 2查看 344关注 0票数 0

我一直在使用Cosmos DB的实体框架核心连接器开发一个使用ASP.NET核心的应用程序。在很大程度上,这是一帆风顺的。现在,我想添加对从数据库中软删除记录的支持,使用我的应用程序查询DeletedAt属性,以确定是否在结果中包含实体。

我使用的是一个基本实体类型,我在其中添加了前面提到的时间戳:

代码语言:javascript
复制
    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属性。

我目前正在从一个通用的存储库类型执行查询,它执行类似以下内容的操作:

代码语言:javascript
复制
return await Queryable.Where(x => x.DeletedAt == null).Where(predicate).ToListAsync();

这适用于定义了DeletedAt属性的新实体,但不包括所有未设置该属性的旧实体。我希望EF对未定义的属性采用默认值,但它似乎完全忽略了旧的实体。

通常,使用SQL Server时,我只需应用迁移并使用null DeletedAt时间戳对所有较旧的实体进行改造,这一切都很棒。然而,在Cosmos DB中,我不确定如何处理这种情况。我是否必须遍历所有较旧的实体并使用删除时间戳对其进行改造,或者是否有其他方法来处理丢失的更改实体和值?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-10-29 09:06:15

在Cosmos中,null和无值(undefined)是有区别的。在SQL query文本中,您可以使用以下内容来查询正在定义的属性(此外,您还可以向表达式添加null检查):

代码语言:javascript
复制
SELECT * 
FROM c 
WHERE NOT IS_DEFINED(c.example)

对于带有linq的C# Cosmos SDK,您可以使用Microsoft.Azure.Cosmos.Linq并执行以下操作:

代码语言:javascript
复制
var qry = container.GetItemLinqQueryable<Item>()
    .Where(x => !x.Example.IsDefined())
    .ToFeedIterator();

不幸的是,对于EF来说,到目前为止这似乎还不太可能。链接:

Git issue

Current available functions

如果你想将它设置为null,你确实需要遍历所有的项目,并设置它,以便可以使用EF进行这样的查询。

票数 2
EN

Stack Overflow用户

发布于 2021-10-29 09:05:09

如果你正在使用Cosmos DB的.NET SDK,并因此使用它的反序列化(使用json.NET),那么如果你的模型类型有一个可以为空的属性,那么你不需要在CosmosDB文档中为该属性设置一个值。

它仍然是一个具有空值的.NET实例。

因此,可以使用应用程序代码中的空值轻松处理CosmosDB文档中的可选属性。

我将Cosmos DB的序列化选项设置为不保存空值,以避免将这些属性全部存储在一起。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69765713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档