0

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

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

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

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

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

4

1 回答 1

0

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

因此,将 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 的查询,并询问“db 中有消息”。所以这一切都在重复,直到数据库中的消息出现。在 db 中出现消息后,他返回List<data>dateTime 之后更新的消息。在那个客户得到数据后,他回到了这一点 - (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 对象,该对象将包含您想要更新的每个实体的列表。将server-side完成并返回此 Dto 对象。

希望能帮助到你。

于 2013-02-21T07:50:17.103 回答