3

我正在编写一个爬虫,它应该去一个网站,从那里提取一些数据,然后将它存储到一个数据库中,问题是爬虫还应该更新之前运行中已经找到的数据。

返回从 EF POCO 中的站点解析的ParseDataPage信息,其属性之一是唯一标识符(也是 db 表中的主键),我如何告诉 EF 插入/添加对象?

class Program
{
    static void Main()
    {

        var context = (adCreatorEntities) DbContextFactory.GetInstance().GetDbContext<adCreatorEntities>();
        var crawler = new DataCrawler();            
        crawler.Login();
        var propertyIds = crawler.GetPropertyIds();

        foreach (var id in propertyIds)
        {
            var poco = crawler.ParseDataPage(id);
            context.Properties.Add(poco); //<-- How can I tell EF to update if the record exists or to insert it otherwise??
            context.SaveChanges();
        }

        context.SaveChanges();

        if (crawler.LoggedIn)
            crawler.Logout();
    }
}
4

2 回答 2

4

您可以根据键的值将实体状态设置为Modified或将实体添加到。DbSet

if(entity.propertyId <= 0)
{
    context.Properties.Add(poco); 
}
else
{
      context.Entry(poco).State = EntityState.Modified;
}

这是 EF5 的代码,EF4 设置对象状态略有不同

context.ObjectStateManager.ChangeObjectState(poco, EntityState.Modified);
于 2013-10-24T04:03:29.890 回答
1

您可以使用以下代码检查记录是否存在,

 var entity= dataContext.Properties.Find(b => b.UniqueId == poco.UniqueId);
                    if (entity== null)
                    {
                        dataContext.Properties.Add(poco);
                    }
                    else
                    {
                       dataContext.Entry(entity).State = EntityState.Modified;
                    }
                   dataContext.SaveChanges();
于 2013-10-24T04:07:10.137 回答