一些架构困境: 我使用WPF作为我的客户端,EF Code First作为我的数据访问层,WCF用于连接它们。在对数据库进行一些更改后,我的问题是重新更新UI,例如:
在谈论一个用户时,它非常简单 - 我也可以返回ID并更新我的UI(因此对此人的下一次更改将被视为“更新”),但是如何同时添加多个用户,或更新在服务器上计算的其他属性?我应该退回整个图表吗?更不用说很难在客户端重新映射它。
在CodeFirst之前,我们可以使用STE,但它有自己的问题。有谁知道已知的CodeFirst方法?
很高兴听到你的声音。 谢谢!
答案 0 :(得分:0)
您可以在wcf服务中将请求发送到客户端上次更新的日期时间。但是在服务器端,您将获取在该dateTime之后更新/添加的所有Persons
并将其作为结果返回。这样,您只能从服务器端获得修改/添加Person
。
因此,将lastUpdate collumn添加到您的实体Person
。
编辑1
如果您希望服务器更新客户端中的信息,而不是客户端请求来自服务器的新闻。
您可以使用Web Programming
中的方式。
(1)client-side
问server-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对象。
希望它有所帮助。