WPF,WCF和代码优先 - 断开模式

时间:2013-02-21 07:45:52

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

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

  1. 用户在UI上插入新的“人物”(ID = 0)
  2. 用户将“人员”保存到数据库(例如,ID = 10)
  3. 在谈论一个用户时,它非常简单 - 我也可以返回ID并更新我的UI(因此对此人的下一次更改将被视为“更新”),但是如何同时添加多个用户,或更新在服务器上计算的其他属性?我应该退回整个图表吗?更不用说很难在客户端重新映射它。

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

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

1 个答案:

答案 0 :(得分:0)

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

因此,将lastUpdate collumn添加到您的实体Person

编辑1

如果您希望服务器更新客户端中的信息,而不是客户端请求来自服务器的新闻。

您可以使用Web Programming中的方式。

(1)client-sideserver-side - “嘿,我的上一次更新是在2013年2月10日20:00”,然后服务器查看数据库 - “是新闻20:00之后的10.02。 2013?”如果是的话:

a)将新闻返回给客户

如果DB中没有新闻:

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

因此,您不会向服务器发出大量请求,只会发出一个请求并等待来自服务器的消息。

注意2件事:

1)如果客户端等待太长时间,服务器端将抛出异常(实际上不记得错误代码但现在不重要),因此您必须在client-side上捕获此异常并发出新请求到server-side。此外,只要您可以等待时间,就必须在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对象,该对象将包含您想要更新的每个实体的List。 server-side将完成并返回此Dto对象。

希望它有所帮助。