实体框架-一次插入多个复杂对象
本文关键字:插入 复杂 对象 一次 框架 实体 | 更新日期: 2023-09-27 17:54:59
我正在为其中一个网站编写解析器,其中有连接到类别的产品。我正试图用这些项目建立我自己的数据库。
我已经决定使用实体框架,但我是新的这个框架,所以这是我的问题:
在解析过程中,我有多个相同类别的项目。但是分类是树状的。我的意思是,category有一个对parentCategory的引用。
在解析过程中,我有一个类别继承列表,如: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,但在这种情况下,它需要在每次我向db添加东西时将更改保存到db中。
还有其他办法吗?
我已经通过创建本地分类字典解决了这个问题,并且在使用之前,用数据库中的数据填充这个字典。
_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