Вставлять данные rss в базу данных с помощью сервисов wcf ria, используя модель представления

Я прочитал много постов, но не могу найти свой ответ. Мой вопрос немного конкретен. В моем проекте Silverlight я хочу получать данные о погоде, такие как температура, статус и дата, из погоды Yahoo и сохранять их в своей базе данных, меняя их значения в rss..so я использовал webclient и его DownloadStringAsync и DownloadStringCompleted для получения data.also я создал модель представления на своем сервере в папке моделей (потому что я хотел использовать ее в своем сервисе), поэтому в моем обработчике событий 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);
                }

Я не знаю, как заставить метод вставки работать. Кто-то, пожалуйста, скажите мне, где я не прав? Я знаю, что где-то есть. Покажите мне путь. с уважением

2 ответа

Решение

Я нашел его. Большое спасибо книге: Silverlight 4 Unleased- глава 13- от великого: Лоран Бюньон.

Во-первых, нет необходимости использовать WeatherConditionModel в качестве модели презентации (идентификатор модели презентации, используемый для сохранения данных в нескольких таблицах). Это просто класс, используемый в качестве держателя вывода моего запроса. во-вторых, вообще не нужно менять метод Insert в сервисе (потому что здесь я хочу сохранить данные только в одной таблице), поэтому просто создайте свой сервис на основе вашей модели сущности и постройте его. после того, как вы его построите, вы можете вызвать Ваша таблица в вашей модели представления (что я не смог, потому что я изменил свои методы обслуживания (я изменил 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);
        }
    }

Спасибо за все внимание. Я надеюсь, что это помогло кому-то. Скажите мне, если у кого-то есть лучшие идеи. пожалуйста, отметьте как ответ, если это помогло кому-либо.

Мне трудно понять, что вы пытаетесь сделать, но шаблон для последнего шага, который вы показываете, должен быть больше похож на:

// 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);
Другие вопросы по тегам