【问题标题】:How can i insert data into database using custom controller method or any other way in ASP.net MVC?如何使用自定义控制器方法或 ASP.net MVC 中的任何其他方式将数据插入数据库?
【发布时间】:2016-04-07 13:22:20
【问题描述】:

我正在尝试从某个网页中抓取数据并将其插入数据库。我在数据库中只有一个名为 Product 的表,其中包含 ProductID、ProductName、ProductPrice,就像您可以从使用 ADO.net 实体数据模型生成的模型中看到的那样

public partial class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public string ProductPrice { get; set; }
    }

我是 asp.net mvc 的新手(3 天前开始学习它)所以它让我有点困惑,并且无法弄清楚在哪里制作新方法来抓取数据并将其放入数据库。 我试图在 ProductController 中创建新的 ActionResult ScrapData() 方法,但是当涉及到 db.SaveChanges() 时,我得到了 ValidationError

public ActionResult ScrapData()
{

    List<Product> product = new List<Product>();
    HtmlDocument doc = new HtmlWeb().Load("http://www.idea.rs/Proizvodi");
    foreach (var node in doc.DocumentNode.SelectNodes("//div[@class='g2 bp_l_1of4 bp_m_1of3 bp_s_1of2 bp_xs_1of1 item  ']"))
    {
        Product p = new Product();
        p.ProductName = node.SelectSingleNode(".//span[@class='item_title']").InnerText;
        p.ProductPrice = node.SelectSingleNode(".//span[@class='price']").InnerText;

        product.Add(p);

    }

        for (int i = 0; i < product.Count; i++)
    {
        db.Products.Add(product[i]);
        db.SaveChanges();

    }

    return View(db.Products.ToList());

}

感谢任何帮助。

【问题讨论】:

  • 你得到了什么确切的错误?在这里发帖
  • EntityFramework.dll 中出现“System.Data.Entity.Validation.DbEntityValidationException”类型的异常,但未在用户代码中处理其他信息:一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
  • ValidationErrors是什么

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

您需要在循环外调用 db.SaveChanges() 即:

for (int i = 0; i < product.Count; i++)
{
    db.Products.Add(product[i]);
}
db.SaveChanges();

【讨论】:

  • 你为什么?性能会更好,但不能解决他遇到的错误
【解决方案2】:

您必须创建连接 beetwen 数据库模型和您的 Product 模型。

例如您的表Products 尝试在另一个类 DBModel 中创建为:

namespace Your_NameSpace
    {
    [Table("Products")]
    public class Products
        {
           [DatabaseGenerated(DatabaseGeneratedOption.Identity)] \\ If you have identity set in table Products, if not remove this line
           [Key] // Primary key
           public int ProductID { get; set; }
           public string ProductName { get; set; }
           public string ProductPrice { get; set; }
        }
     }

对于循环使用的控制器的下一步:

        for (int i = 0; i < product.Count; i++)
            {
                 var DBModel = new Products();
                 DBModel.ProductName = product[i].ProductName;
                 DBModel.ProductPrice = product[i].ProductPrice;
                 db.Products.Add(DBModel);
            }

        db.SaveChanges();

【讨论】:

    【解决方案3】:

    尝试使用 Mapper(自动映射器)将您的模型产品映射到您的实体 Db.Products。

    或者您可以手动执行此操作

        for (int i = 0; i < products.Count; i++)
                    {
                         var product= new Products();
                         product.ProductName = product[i].ProductName;
                         product.ProductPrice = product[i].ProductPrice;
                         db.Products.Add(product);
                    }
    
     db.SaveChanges();
    

    或者你可以试试这个

       foreach (var node in doc.DocumentNode.SelectNodes("//div[@class='g2 bp_l_1of4 bp_m_1of3 bp_s_1of2 bp_xs_1of1 item  ']"))
            {
                Products p = new Product();
                p.ProductName = node.SelectSingleNode(".//span[@class='item_title']").InnerText;
                p.ProductPrice = node.SelectSingleNode(".//span[@class='price']").InnerText;
    
                 db.Products.Add(p);
    
            }
        db.SaveChanges();
    

    【讨论】:

    • 谢谢大家这么快的帮助......当我创建新项目并从头开始重做所有事情时,我设法让它工作,这是一团糟,因为我删除了许多脚手架项目等.. . 使用 Dawid 的第一部分代码,我为 ScrapData 和 Kypaz 的想法生成了控制器和视图,将 db.SaveChanges() 放在循环之后,它现在就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2015-09-01
    相关资源
    最近更新 更多