【问题标题】:Inserting datatable data to database using Entity Framework?使用实体框架将数据表数据插入数据库?
【发布时间】:2014-03-14 12:35:26
【问题描述】:

我有一个数据表,我想使用实体框架将数据插入数据库(SSMS)。什么是可行的解决方案?

【问题讨论】:

    标签: entity-framework c#-4.0 datatable


    【解决方案1】:

    DataTable 是原始行和列 - Entity Framework 与 .NET 对象一起使用,这基本上是另外一回事。

    因此,您不能轻松使用 EF 从DataTable 插入行和列。

    要么需要遍历您的 DataTable 并从这些行和列构建对象,将它们粘贴到 List<YourObject> 中,然后使用 EF 将这些对象保存到数据库中... .

    您只需跳过 EF 并使用原始 ADO.NET 将“原始”DataTable 持久保存到数据库(SqlDataAdapterSqlCommandINSERT 语句)。

    更新:

    好的,所以您想将您的DataTable 转换为对象。你需要有一个类来代表你在数据库中的实体——因为你没有提供任何信息,我只是将它称为MyObject

    public class MyObject
    {
       // define some properties
       public int ID { get; set; }
       public string Name { get; set; }
       // whatever else this object has
    }
    

    您很可能已经有这样一个对象 - entity 类 - 存在于您的数据库中。

    然后你需要定义一个方法将数据表转换为对象列表:

    public List<MyObject> ConvertDataTable(DataTable tbl)
    {
         List<MyObject> results = new List<MyObject>();
    
         // iterate over your data table
         foreach(DataRow row in tbl.Rows)
         {
             MyObject convertedObject = ConvertRowToMyObject(row);
             results.Add(convertedObject);
         }
    
         return results;
    } 
    

    现在您需要最后一个方法将单行转换为您的对象类型:

    public MyObject ConvertRowToMyObject(DataRow row)
    {
         MyObject result = new MyObject();
    
         // assign the properties of MyObject from the DataRow
         result.ID = row.GetInt32(0);
         result.Name = row.GetString(1);
         // and so on .... convert the column values in the DataRow into the
         // properties of your object type
    
         return result;
    }
    

    【讨论】:

    • 我会选择这个 -> 您需要遍历您的 DataTable 并从这些行和列构建对象,将它们粘贴到 List 中,然后使用 EF 将这些对象保存到数据库中...您能否为此提供任何示例代码或链接?
    • 我知道这篇文章很旧,但可能有价值的是:exceptionnotfound.net/…
    • @Ken:感谢您的指点 - 不错的博客,已经看到关于各种主题的有趣帖子
    【解决方案2】:

    我发现了另一种相同的方式,但代码更少,而且我认为更容易。我想我应该在这里分享它,可能会帮助其他人。

    using (var productDB = new studentDBEntities()) //JFEntity object
          {
          for (int i = 0; i < DataExcelTable.Rows.Count; i++)
              {
                    DataRow dr = DataExcelTable.Rows[i];
                    productDB.Products.Add(new Product() 
                    { //add data to class objects variable
                    ProductName = dr["ProductNumber"].ToString(),
                    ProductNumber=Convert.ToInt32 (dr["ProductNumber"]),
                    Size=dr["size"].ToString(),
                    Weight=Convert.ToInt32( dr["weight"]),
                    Price=Convert.ToInt32(dr["price"]),
                    SaleStatus=Convert.ToBoolean(dr["salestatus"])
                    });
               } productDB.SaveChanges();
           }
    

    【讨论】:

    • 您的方法依赖于数据表中每个列名的字符串值(例如,而不是对象属性)。如果列名更改,您必须更新此代码段。
    • SQL 注入的绝佳场所
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多