【问题标题】:multiple deserialization of same object should or not create new instances?同一对象的多个反序列化应该或不应该创建新实例?
【发布时间】:2013-07-17 10:04:54
【问题描述】:

在我的场景中,我有一个 MVC 关于 iis 序列化实体框架中的对象,其中我已经覆盖了 GetHashCode 和 Equal 方法,因为 一旦提交到数据库,这些对象的 ID 是不可变的。
我也有一些客户端,他们无法访问数据库,但连接到 iis 以通过 json 序列化这些实体并使用 newtonsoft.json 在本地反序列化它们。
当我第二次在客户端反序列化它们以刷新其中的数据时,我希望现有实例能够自动更新。

我的期待有点过头了?
我应该编写一些克隆方法来复制属性并检查现有 ID 的缓存吗?
我在 Equal 和 GetHashCode 方法中写错了吗?

例如:

  1. 我在数据库中有一个带有标题的博客实体
  2. 客户端连接到 iis
    1. 获取包含 {"Id" : 1, "Name" : "blogName"} 的 json 字符串
    2. 反序列化并存储在本地
    3. 以与我在客户端使用的类博客中的可观察集合相同的方式将帖子添加到博客
  3. 某人或某事更改数据库中的博客名称
  4. 客户端尝试刷新
    1. 获取包含 {"Id" : 1, "Name" : "newBlogName"} 的 json 字符串
    2. 将其反序列化为具有相同 id 的类 blog 的新实例

接下来是什么?将新实例名称复制到旧实例名称,或者有更好的方法吗?

【问题讨论】:

    标签: asp.net-mvc json entity-framework serialization


    【解决方案1】:

    是的,你期望太高了。您可以附加新实体(因为实体框架上下文不知道该实体,因为您从 dbcontext 之外的某个地方获取它)然后保存它。

    回复here

    //This place is where you can deserialize your entity
    var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
    
    using (var context = new BloggingContext())
    {
        context.Blogs.Attach(existingBlog);
    
        // Do some more work... 
    
        context.SaveChanges();
    }
    

    【讨论】:

    • 实际上我在客户端工作,所以我根本没有 dbContext。真正痛苦的是在数据刷新期间处理关系,因为我从反序列化中获得了新的实例,而旧的仍然存在。我在问自己是否可以在客户端的离线模式下使用 ef,所以我可以像您在此处描述的那样反序列化其中的实体。实际上我重写了所有的实体类来模拟关系的 ef 行为;并有一些导航属性作为可观察的集合,以便在绑定中使用它们并在两侧维护 rel。
    • 没有问题。客户端您不需要关心保存(如何保存)-您只关心将更改的数据传回并在那里(服务器端)检查数据是否已更改(从数据库获取实际数据,更新属性)以及是否改变 - 保存。尝试将序列化和反序列化对象视为 DTO(数据传输对象)——这将使事情更容易理解。什么是 DTO?简单的数据,仅此而已。
    • 我已经更新了问题,希望现在更清楚。客户端无法访问数据库。我的意思不是把更新的数据保存到数据库中,而是从数据库中获取更新的数据
    • 删除旧实体并插入新实体。顺便说一句,现在您的问题与实体框架无关。而且还不清楚你的客户端是什么:windows 应用程序、网络浏览器、silverlight...
    • 这取决于你需要什么。对于 Web 客户端 - 这是一个好方法,对于 Windows 应用程序 - 也许不是,因为重新插入会导致 UI 闪烁......
    【解决方案2】:

    我认为最好的解决方案是一个服务器端和一个客户端有两个数据库,具有相同的共享实体框架但不同的连接字符串,设置了保持对象引用的 json.net 并仅使用网络来同步数据库然后在客户端查询它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2011-06-08
      相关资源
      最近更新 更多