Вставлять данные 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);