0

我已经阅读了很多帖子,但找不到我的答案。我的问题有点具体。在我的 silverlight 项目中,我想从雅虎天气中获取天气数据,如温度、状态和日期,并通过从其 rss 更改将其保存到我的数据库中.so 使用 webclient 及其 DownloadStringAsync 和 DownloadStringCompleted 来获取数据。我还在服务器的模型文件夹中创建了一个演示模型(因为我想在我的服务中使用它)所以在我的 DownloadStringCompleted 事件处理程序中我做了这样的事情:

  void xmlclient_DownloadStringCompleted(object sender,DownloadStringCompletedEventArgs e)
    {
        XNamespace yweather = "http://xml.weather.yahoo.com/ns/rss/1.0";
        if (e.Error == null)
        {
            XElement x = XElement.Parse(e.Result);
            weatherquery1 =
               from items in x.Descendants("item")

               select new BusinessApplication1.Web.Models.WeatherConditionModel
               {

               PubDate = items.Element(yweather +"condition").Attribute("date").Value,
               Status = items.Element(yweather + "condition").Attribute("text").Value
               };
             }

           }

这是在我的视图模型中,我测试了它所有的作品。我可以获取数据,也可以在数据网格或列表框中查看结果。现在我想将数据保存在我的数据库中。我希望它自动完成,而不是通过按钮或命令。例如,我希望它始终读取数据并每 5 分钟将其保存到数据库中。所以我创建了我的服务我创建了一个自定义插入,我可以自己塑造它:

 private void MapwcModel(WeatherConditionTable wctable, WeatherConditionModel wcPM)
     {
        wctable.Status = wcPM.Status;
        wctable.PubDate = wcPM.PubDate;
        wctable.WeatherConditionID = wcPM.WeatherConditionID;

     }

    [Insert]
    [Invoke]
    public void InsertWeatherConditionData(WeatherConditionModel WeatherConditionData)
    {
        WeatherConditionTable wc = WeatherConditionContext.WeatherConditionTables.CreateObject();
        MapwcModel(wc, WeatherConditionData);
        wc.Status = WeatherConditionData.Status;
        wc.PubDate = WeatherConditionData.PubDate;
        WeatherConditionContext.WeatherConditionTables.AddObject(wc);
        WeatherConditionContext.SaveChanges();


    }

和我的获取数据:

        public IQueryable<WeatherConditionModel> GetWeatherConditionData()
           {
         return from p in this.WeatherConditionContext.WeatherConditionTables
               select new WeatherConditionModel
               {
                   WeatherConditionID = p.WeatherConditionID,
                   Status = p.Status,
                   PubDate = p.PubDate,

               };
           }

现在我不知道如何强制它保存数据。我在我的 iewmodel 中写了这个但没有工作:

    foreach (BusinessApplication1.Web.Models.WeatherConditionModel el in weatherquery1)

                {
                WeatherConditionDomainContext context = new WeatherConditionDomainContext();
                EntityQuery<BusinessApplication1.Web.Models.WeatherConditionModel> weatherLoadQuery = context.GetWeatherConditionDataQuery();
                context.Load<BusinessApplication1.Web.Models.WeatherConditionModel>(weatherLoadQuery);
                context.SubmitChanges(delegate(SubmitOperation operation)
                {
                    if (operation.HasError)
                    {
                        operation.MarkErrorAsHandled();
                    }
                }, null);
                }

我不知道如何强制插入方法起作用。有人请告诉我我错在哪里?我知道在某个地方。告诉我路。最好的祝福

4

2 回答 2

0

我很难理解您要做什么,但是您展示的最后一步的模式应该更像:

// Create data context
WeatherConditionDomainContext context = new WeatherConditionDomainContext();

// Load existing entities
EntityQuery<BusinessApplication1.Web.Models.WeatherConditionModel> weatherLoadQuery = context.GetWeatherConditionDataQuery();
context.Load<BusinessApplication1.Web.Models.WeatherConditionModel>(weatherLoadQuery);

// Update or insert new entries
foreach (BusinessApplication1.Web.Models.WeatherConditionModel el in weatherquery1)
{
    // Update existing entries

    // Or, add new entries if they did not exists
}

// Submit all changes (updates & inserts)
context.SubmitChanges(delegate(SubmitOperation operation)
    {
        if (operation.HasError)
        {
            operation.MarkErrorAsHandled();
        }
    }, null);
于 2012-04-30T14:40:53.710 回答
0

我找到了它。非常感谢书:Silverlight 4 Unleased-第 13 章-来自伟大的:Laurent Bugnion。

首先,没有必要将 WeatherConditionModel 用作表示模型(当您需要将数据保存在多个表中时使用表示模型 id)。它只是用作我的查询输出的持有者的类。其次,根本不需要更改服务中的插入方法(因为这里我只想将数据保存在一个表中)所以,只需在您的实体模型上创建您的服务并构建它。以这种方式构建后,您可以调用您在视图模型中的表(我不能,因为我更改了我的服务方法(我将 WeatherConditionTable 更改为 WeatherConditionModel(类!!),如您所见)。第三,在我的 foreach 循环中,我可以将我的数据保存到我的数据库。.我有一个组合框和一个列表框和一个按钮,我从组合框中选择我的城市,然后点击使用命令到我的 GetRss 的按钮,它现在很好地完成了这项工作。它显示数据并将其保存到数据库。这是我的视图模型代码(描述部分):

      internal void GetRssFeed()
          {
            Feed selectedFeed = (Feed)FeedModel.FeedList[FeedModel.SelectedIndex];
            FeedModel.SelectedFeedName = selectedFeed.FeedName;
            WebClient xmlclient = new WebClient();
            xmlclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xmlclient_DownloadStringCompleted);
        xmlclient.DownloadStringAsync(new Uri(selectedFeed.FeedUrl));

    }

    WeatherConditionDomainContext context = new WeatherConditionDomainContext();
    WeatherConditionTable wct = new WeatherConditionTable();
    void xmlclient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        XNamespace yweather = "http://xml.weather.yahoo.com/ns/rss/1.0";
        if (e.Error == null)
        {

            XElement x = XElement.Parse(e.Result);
            weatherquery1 =
               from items in x.Descendants("channel")
               let item=items.Element("item")
               select new WeatherConditionModel
               {
                   Temp = Convert.ToInt32(item.Element(yweather + "condition").Attribute("temp").Value),
                   PubDate = item.Element(yweather + "condition").Attribute("date").Value,
                   Status = item.Element(yweather + "condition").Attribute("text").Value,
                   Humidity=Convert.ToInt32(items.Element(yweather + "atmosphere").Attribute("humidity").Value)
               };

            foreach (WeatherConditionModel wc in weatherquery1)
           {

                   wct.Temp = wc.Temp;
                   wct.Status = wc.Status;
                   wct.PubDate = DateTime.Now.ToShortTimeString();
                   wct.Humidity = wc.Humidity;
                   context.WeatherConditionTables.Add(wct);
                   context.SubmitChanges();


           }
        }
        else
        {
            MessageBox.Show(e.Error.Message);
        }
    }

thanks for all attention.i hope it helped someone.tell me if anyone have better ideas. please mark as answer if it helped anyone.

于 2012-05-03T16:12:12.887 回答