0

私は多くの投稿を読みましたが、私の答えを見つけることができません.私の質問は少し具体的です.私のシルバーライトプロジェクトでは、ヤフーの天気から温度、ステータス、日付などの気象データを取得し、RSSから変更してデータベースに保存したいと考えています.so を使用して webclient とその DownloadStringAsync および 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
               };
             }

           }

これは私のビューモデルにあり、すべてが機能することをテストしました。データを取得でき、データグリッドまたはリストボックスで結果を確認することもできます。inow データベースにデータを保存したい. ボタンやコマンドではなく自動的に保存したい. 常にデータを読み込んで、たとえば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

私はそれを見つけました。本に感謝します: Silverlight 4 Unleased- Chapter 13- from the great: Laurent Bugnion .

まず、WeatherConditionModel をプレゼンテーション モデル (複数のテーブルにデータを保存する必要がある場合に使用されるプレゼンテーション モデル ID) として使用する必要はありません。これは、クエリ出力のホルダーとして使用される単なるクラスです。次に、サービスの Insert メソッドをまったく変更する必要はありません (ここではデータを 1 つのテーブルだけに保存​​したいため) ため、エンティティ モデルにサービスを作成してビルドするだけです。この方法でビルドした後、呼び出すことができます。ビューモデルのテーブル(サービスメソッドを変更したため、これはできませんでした(WeatherConditionTableをWeatherConditionModel(クラス!!)に手動で変更しました)。3番目に、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);
        }
    }

すべての注意に感謝します。誰かの役に立てば幸いです。より良いアイデアがあるかどうか教えてください それが誰かを助けた場合は、回答としてマークしてください。

于 2012-05-03T16:12:12.887 に答える
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 に答える