【问题标题】:WPF, WCF and Code First - Disconnected modeWPF、WCF 和代码优先 - 断开连接模式
【发布时间】:2013-02-21 07:45:52
【问题描述】:

一些架构困境: 我使用 WPF 作为客户端,使用 EF Code First 作为我的数据访问层,使用 WCF 在它们之间进行连接。我的问题是在对数据库进行一些更改后重新更新 UI,例如:

  1. 用户在 UI 上插入新的“Person” (ID=0)
  2. 用户将“Person”保存到数据库(例如 ID=10)

当谈论一个用户时,这很简单——我可以返回 ID 并更新我的 UI(因此对这个人的下一次更改将被视为“更新”),但是一次添加多个用户呢?或更新在服务器上计算的其他属性?我应该返回整个图表吗?更不用说在客户端重新映射它非常困难。

在 CodeFirst 之前我们可以使用 STE,但它有它自己的问题。有人知道已知的 CodeFirst 方法吗?

很高兴听到你的声音。 谢谢!

【问题讨论】:

    标签: c# .net wpf wcf ef-code-first


    【解决方案1】:

    您可以将您上次在客户端更新的日期时间作为请求发送到您的 wcf 服务。但是在服务器端,您会获取在该日期时间之后更新/添加的所有 Persons 并将其作为结果返回。这样,您将只能从服务器端获得修改/添加的Persons。

    所以将 lastUpdate 列添加到您的实体 Person

    编辑 1

    如果您想服务器更新客户端中的信息而不是客户端从服务器请求消息。

    您可以使用它在Web Programming 中的工作方式。

    (1)client-side 询问server-side -“嘿,我的最后一次更新是在 2013 年 10 月 2 日 20:00 ”,然后服务器查看数据库 -“2013 年 2 月 20 日 20:00 之后有新闻吗?”如果是:

    a) 将消息返回给客户端

    如果数据库中没有消息:

    b) 他不返回 null,但他执行 Thread.Sleep(somevalue)。他睡着了,然后重复查询数据库并询问“数据库中有消息”。所以这一切都在重复,直到数据库中的消息出现。在 db 中出现消息后,他返回List<data>,该List<data> 在 dateTime 之后更新。在那个客户得到数据后,他回到点 - (1)。

    所以你不会向服务器发出很多请求,而是只发出一个请求并等待来自服务器的消息。

    注意两件事:

    1) 如果客户端等待的时间过长,服务器端会抛出异常(实际上不记得错误代码但现在不重要了),所以你必须在client-side 上捕获这个异常,然后向@ 发出新请求987654329@。另外你必须在server-side上配置,只要你可以等待时间,以尽量减少来自客户端的请求量。

    2) 您必须在新线程中运行此 data-updater,而不是在应用程序运行的主线程中。

    从代码看它的样子(它可能不起作用,我只是想向您展示逻辑):

    服务器端:

    public List<SomeData> Updater(DateTime clientSideLastUpdate)
    {
         List<SomeData> news = new List<SomeData>();
         while(true)
         {
             List<SomeData> news = dbContext.SomeData.Where(e=>e.UpdateDateTime > clientSideLastUpdate).ToList();
             if(news.Count()>0)
             {
                 return news;
             }
         }
    }
    

    客户端:

    public static void Updater()
    {
        try
        {
            var news = someServiceReference.Updater(DateTime clientSideLastUpdate);
            RenewDataInForms(news);
            Updater();
        }
        catch(ServerDiesOrWhatElseExcepption)
        {
            Updater()
        }
    }
    

    在代码的某处,您在新线程中运行此更新程序

     Thread updaterThread = new Thread(Updater());
     updaterThread.Start();
    

    编辑 2

    如果您想通过一个请求更新所有实体,而不仅仅是SomeData,那么您必须添加 Dto 对象,该对象将包含您想要更新的每个实体的列表。 server-side 将完成并返回此 Dto 对象。

    希望对你有帮助。

    【讨论】:

    • 没错,这是支持多客户端更新的一个选项。但我正在寻找更通用的方法来实现这一目标,即使没有从其他客户那里获得所有更新。
    • 您想不通过 Wcf 服务器直接将 2 个或多个客户端相互连接吗?
    • 是的,但我的问题更多是关于一个客户端 - 更新后我应该如何使用来自服务器的详细信息(如 STE)更新客户端?
    • 哦,您希望服务器将信息发送给客户端,而不是客户端请求新项目和服务器答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多