实体框架 - 一次插入多个复杂对象

时间:2014-03-29 09:49:44

标签: c# linq entity-framework

我正在为其中一个网站编写解析器,其中的产品已连接到类别。我正在尝试使用这些项目构建自己的数据库。

我决定使用Entity Framework,但我是这个框架的新手,所以这是我的问题:

在解析过程中,我有多个具有相同类别的项目。但是类别是一种树木。我的意思是,类别引用了parentCategory。

在解析期间,我有一个类别继承列表f.e:category1 - > category1.1 - > category1.1.1

我解析并添加到数据库的每个产品都需要验证该类别是否存在,并通过类别继承来创建不存在的类别。

代码如下所示:

Category parentCategory = null;
foreach (var sCategory in categories)
{
    var currentCategory = d.CategorySet.SingleOrDefault(category => category.Name == sCategory && category.Parent == parentCategory);
    if (currentCategory == null)
    {
        currentCategory = new Category(){Name = sCategory,Parent = parentCategory};
        if(parentCategory != null)
            d.Entry(parentCategory).State = EntityState.Unchanged;
    }
    parentCategory = currentCategory;
}

但在这种情况下,SingleOrDefault LinQ因异常而无效:

Unable to create a constant value of type 'DataBaseModel.Category'. Only primitive types or enumeration types are supported in this context.

我知道我应该比较类别的ID,但是在这种情况下,每次我向数据库添加时都需要将更改保存到数据库中。

还有其他可能性吗?

1 个答案:

答案 0 :(得分:0)

我通过创建类别的本地词典并在使用之前解决了这个问题,通过数据库中的数据填充这些词典。

_categoriesDictionary.Clear();
foreach (var category in this.Container.CategorySet)
{
    Category temp = category;
    string fullCategoryString = "";
    while (temp != null)
    {
        fullCategoryString = fullCategoryString.Insert(0, temp.Name + ";");
        temp = temp.Parent;
    }
    _categoriesDictionary.Add(fullCategoryString, category);
}

然后在分析记录时:

Category parentCategory = null;
string fullCatString = "";
foreach (var sCategory in categories)
{
    fullCatString += sCategory + ";";
    Category currentCategory;
    if (!_categoriesDictionary.TryGetValue(fullCatString, out currentCategory))
    {

        currentCategory = new Category()
        {
            Name = sCategory,
            Parent = parentCategory
        };
        this.Container.CategorySet.Add(currentCategory);
        _categoriesDictionary.Add(fullCatString, currentCategory);
    }
    parentCategory = currentCategory;
}
result.Category = parentCategory;

从我的角度来看,这是另一个冒险: 它收集数据开始,然后每次都不查询DB