实体框架:如何从DB表中尚不存在的列表中插入数据

时间:2015-04-22 02:52:39

标签: c# entity-framework

我从ListBox获取数据并插入数据库。 在数据插入之前,我需要确保数据库中不存在ListBox中的数据。简而言之,只插入与数据库中的行不匹配的行。 下面的示例表。

数据插入代码:

    private void InsertList()
    {
        var listA = new List<string>();
        var listB = new List<string>();

        //Populate both list by splitting items in listbox

        foreach (ListItem item in ListBox1.Items)
        {
            var components = item.Value.Split('/');

            listA.Add(components.First());

            listB.Add(components.Last());
        }

        using (DataContext dataContext = new DataContext())
        {
            for (var i = 0; i < listA.Count; i++)
            {
                LIST_OBJECTS listObject = new LIST_OBJECTS
                {

        // Need to check data does not already exists in DB before adding.

                    LIST_KEY = 1,
                    LIST_ITEM_A = listA[i],
                    LIST_ITEM_B = listB[i]
                };

                dataContext.LIST_OBJECTS.Add(listObject);
            }

            dataContext.SaveChanges();
        }
    }

示例表:

在下表中,如果列表中存在突出显示的数据,则不会插入该数据,因为它已存在于数据库中。

enter image description here

感谢我的朋友:

1 个答案:

答案 0 :(得分:1)

鉴于它有点冗长的条件(它不适合一条线):

        for (var i = 0; i < listA.Count; i++)
        {
            if (!exists(dataContext, listA[i], listB[i])) 
            {
                LIST_OBJECTS listObject = new LIST_OBJECTS
                {
                    LIST_KEY = 1,
                    LIST_ITEM_A = listA[i],
                    LIST_ITEM_B = listB[i]
                };
                dataContext.LIST_OBJECTS.Add(listObject);
            }
        }

        dataContext.SaveChanges();

然后是一个单独的私有方法:

private bool exists(DataContext ctx, string a, string b) 
{
    return ctx.LIST_OBJECTS.Any(i => i.LIST_ITEM_A == a
                             && i => i.LIST_ITEM_B == b);
}