gpt4 book ai didi

c# - 如何使用 Entity Framework 添加对象而不复制其关联实体

转载 作者:行者123 更新时间:2023-11-30 23:13:07 25 4
gpt4 key购买 nike

我有以下模型:Product 类、Category 类、Color 类和 Size 类;每个 Product 都有一个 CategoryColorSize

信息来自 CSV 文件,因此在我将产品添加到数据库之前,我执行了 LINQ Select distinct on category、color and a size 并首先使用 EF 代码将它们插入到适当的表中。

在那之前,没有问题。

然后我尝试做的是遍历 CSV 文件的每一行,并为每个产品获取其类别、大小和颜色,并为其中的每一个创建实例对象。

  public void InsertProduct(Product product)
{
using (var context = new ExamContext())
{
ICategoryDao categoryDao = new CategoryDao();
IColorDao colorDao = new ColorDao();
ISizeDao sizeDao = new SizeDao();

var category = categoryDao.GetCategoryByName(product.Category.CategoryName);
var color = colorDao.GetColorByName(product.Color.ColorName);
var size = sizeDao.GetSizeByName(product.Size.SizeName);

var categoryEntity = new CategoryEntity()
{
Id = category.Id,
CategoryName = category.CategoryName
};

var colorEntity = new ColorEntity()
{
Id = color.Id,
ColorName = color.ColorName
};

var sizeEntity = new SizeEntity()
{
Id = size.Id,
SizeName = size.SizeName
};

ProductEntity productEntity = new ProductEntity();
productEntity.ActionPrice = product.ActionPrice;
productEntity.ArticleNumber = product.ArticleNumber;
productEntity.Category = categoryEntity;
productEntity.Color = colorEntity;
productEntity.Size = sizeEntity;
productEntity.DeliveryTime = product.DeliveryTime;
productEntity.Description = product.Description;
productEntity.Key = product.Key;
productEntity.Price = product.Price;
productEntity.ActionPrice = product.ActionPrice;
productEntity.Q1 = product.Q1;


//Had issues with mapper and navigation attributes
//var entity = Mapper.Map<Product, ProductEntity>(product);
context.ProductEntities.Add(productEntity);
context.SaveChanges();

// update business object with new id
//product.Id = entity.Id;
}
}

然后在保存更改时我得到一个 UNIQUE KEY 异常,这是意料之中的事情,因为类别名称、颜色名称和尺寸名称在它们自己的表中是唯一的键。 (不在产品表本身)。

如何在不尝试插入类别、颜色和尺寸的情况下插入产品?

public class SizeEntity
{
public int Id { get; set; }
[Index("SizeName", IsUnique = true)]
[MaxLength(100)]
public string SizeName { get; set; }
}

public class ColorEntity
{
public int Id { get; set; }
[Index("ColorName", IsUnique = true)]
[MaxLength(100)]
public string ColorName { get; set; }
}

public class CategoryEntity
{
public int Id { get; set; }
[Index("CategoryName", IsUnique = true)]
[MaxLength(100)]
public string CategoryName { get; set; }
}

请注意,ProductDao 对象获取一个产品(来自业务对象层),实际上不是一个产品实体(来自数据访问层),所以这就是为什么我对该方法进行某种手动映射(对象实例创建)的原因,这是出了问题的地方。

最佳答案

如果您不想创建重复项,则需要在将它们分配给产品实体之前从数据库中获取每个实体,例如:

var categoryEntity = context.CategoryEntities.Find(category.Id);
if(categoryEntity == null)
{
categoryEntity = new CategoryEntity()
{
Id = category.Id,
CategoryName = category.CategoryName
};
context.CategoryEntities.Add(categoryEntity);
}

// same approach for other entities

假设这些实体中的每一个都将 Id 作为主键,您需要在调用 Find 方法之前将这些实体添加到上下文中。

您必须知道,如果您尝试执行批量插入,这种方法效率极低。我的建议是只执行一次 context.SaveChanges(),而不是在添加每个实体之后执行。

关于c# - 如何使用 Entity Framework 添加对象而不复制其关联实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com