有没有一种方法可以将字符串数组而不是单独的参数传递给Entity Framework类?

时间:2020-05-27 16:08:10

标签: c# .net class entity-framework-core oledb

当前,我有一个使用OleDb从Excel工作表中获取数据并将其导入到使用Entity Framework的SQL Server数据库中的程序。

在缩小OleDb和EF之间的距离时,我将数据从Excel工作表推送到DataTable,进入DataTable以将所有数据收集到一行中,然后将其放入StringBuilder用逗号隔开,然后将那个StringBuilder对象变成一个用逗号隔开的字符串数组。这样,我然后调用Add函数以使用EF将数据导入数据库。

在下面显示的代码中,您可以看到我必须致电

Name = data[0], Message = data[1]

etc将数据推送到数据库中。有没有办法我可以将字符串数组而不是每个单独的参数传递给类,并在那里处理数据?

public static void Insert(string Sheet, OleDbConnection conn)
{
        OleDbCommand command = new OleDbCommand("SELECT Name, Message, Message type FROM [" + Sheet + "$]", conn); //Selects everything inside excel file
        DataTable Data = new DataTable();

        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(Data); //Puts all data inside a DataSet

        StringBuilder sb = new StringBuilder();
        var context = new DataWarehouseContext();

        // Prints out DataSet
        foreach (DataRow dataRow in Data.Rows)
        {
            foreach (var item in dataRow.ItemArray)
            {
                sb.Append(item);
                sb.Append(",");
            }

            string[] data = sb.ToString().Split(','); //Gets data for each item in vHealth Insert method
            context.RvtoolsVHealth.Add(new RvtoolsVHealth { Name = data[0], Message = data[1], MessageType = data[2] });
            context.SaveChanges();
        }
}

任何指针都很好,谢谢!

1 个答案:

答案 0 :(得分:1)

不是内置的。您可以 RvtoolsVHealth创建一个构造函数,该构造函数采用字符串数组并设置属性,但是我认为这是一个较差的API,因为无法确保将属性映射到适当的数组值。如果数组按顺序包含消息类型,消息和名称,该怎么办?

您正在做的是实例化对象的规范方法。

我要说的是,您似乎通过连接一个字符串仅将其拆分出去而浪费了一些精力。为什么不直接从dataRow中提取值:

foreach (DataRow dataRow in Data.Rows)
{
    context.RvtoolsVHealth.Add(new RvtoolsVHealth { 
        Name        = dataRow[0].ToString(), 
        Message     = dataRow[1].ToString(), 
        MessageType = dataRow[2].ToString() 
        });
    context.SaveChanges();
}

您甚至可以更进一步,使用OleDbDataReader读取值,而不用花时间填写DataTable

相关问题