2014-03-29 37 views
0

我正在为其中一个网站编写解析器,该网站的产品已连接到类别。我正尝试用这些项目构建我自己的数据库。实体框架 - 一次插入多个复杂对象

我已经决定使用实体框架,但我是新来这个框架,所以这里是我的问题:

在分析时我有相同类型的多个项目。但类别是种树。我的意思是,类别有一个对parentCategory的引用。

解析的过程中,我有类继承FE的列表:类别1 - > 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. 

我知道,我应该比较类别的标识,但在这每次将数据添加到数据库时,都需要将更改保存到数据库中。

有没有其他可能性来处理?

回答

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; 

这是从我的角度来看另一个adventage:在启动 它收集数据,然后不查询DB每次