【问题标题】:RavenDb changes to Property (nullable) on Entity that is a class doesn't saveRavenDb 更改为类的实体上的属性(可为空)不保存
【发布时间】:2021-01-22 20:51:42
【问题描述】:

我有这样的课:

public class Content {
   public string Id {get; set;} = "content/"
   public ContentJob? Job {get; set;}
}

public class ContentJob {
   public string JobId {get; set;} = string.Empty;
}

我可以创建内容,如果工作在那里,它将持续存在。使用 Store/SaveChanges。

但我不能做的是在 Content 上更新(或更准确地设置) ContentJob 并让它检测到有变化。 (HasChange(instance) == false) 并且 SaveChanges 不会更新数据库。

为什么?以及如何让它检测到变化?

(顺便说一下,我尝试使用 C# 9 记录,希望因为它会自动执行深度对象相等,这将解决它,不,它没有)

【问题讨论】:

    标签: ravendb ravendb5


    【解决方案1】:

    我根据您的问题创建了一个单元测试,它按预期工作。

     [Fact]
            public void ShouldWork()
            {
                using (var store = GetDocumentStore())
                {
                    string id = string.Empty;
                    using (var session = store.OpenSession())
                    {
                        var c = new Content();
                        session.Store(c);
                        session.SaveChanges();
                        id = session.Advanced.GetDocumentId(c);
    
                        var entity = session.Load<Content>(id);
                        entity.Job = new ContentJob()
                        {
                            JobId = "123"
                        };
                        
                        Assert.True(session.Advanced.HasChanged(entity));
                        session.SaveChanges();
                    }
    
                    Assert.False(string.IsNullOrEmpty(id));
    
                    using (var session = store.OpenSession())
                    {
                        var entity = session.Load<Content>(id);
                        Assert.NotNull(entity.Job);
                        Assert.Equal("123", entity.Job.JobId);
                    }
                }
            }
            public class Content
            {
                public string Id { get; set; } = "content/";
                public ContentJob? Job { get; set; }
            }
    
            public class ContentJob
            {
                public string JobId { get; set; } = string.Empty;
            }
    

    【讨论】:

    • 我认为唯一的区别是我们生成的初始内容是在前一个会话中完成的。然后使用基于安全性的过滤查询检索它,该查询仅应用 Linq where 然后返回 FirstOrDefaultAsync()。会不会是这个问题?
    • 我尝试使用查询获取实体,单元测试通过。如果可以将失败的单元测试发送到:groups.google.com/forum/?utm_source=footer#!forum/ravendb,那将是最好的
    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多