C# 将产品分配到类别,并在产品对象中将CategoryName指定为外键
我有一个CMS系统,用户可以在其中创建一个C# 将产品分配到类别,并在产品对象中将CategoryName指定为外键,c#,sql,sql-server,C#,Sql,Sql Server,我有一个CMS系统,用户可以在其中创建一个类别对象,然后用户可以单击创建的类别并向其中添加产品对象。当用户浏览产品时,他们可以单击某个类别,该类别将CategoryId与Post请求一起发送到产品索引页。然后,“产品索引”页面获取与传递的类别Id匹配的类别对象,选择属于该类别的“产品列表”属性并显示产品类别类具有产品列表的属性 我现在有了一个CSV数据导入表单,它允许用户做同样的事情,但只需上传一个CSV文件 CSV文件数据(灰色阴影)是产品列表。注-每种产品的类别名称栏(第5阴影栏,即“家”、
类别
对象,然后用户可以单击创建的类别并向其中添加产品
对象。当用户浏览产品时,他们可以单击某个类别,该类别将CategoryId与Post请求一起发送到产品索引页。然后,“产品索引”页面获取与传递的类别Id匹配的类别对象,选择属于该类别的“产品列表”属性并显示产品<代码>类别类具有产品列表的属性
我现在有了一个CSV数据导入表单
,它允许用户做同样的事情,但只需上传一个CSV文件
CSV文件数据(灰色阴影)是产品列表。注-每种产品的类别名称栏(第5阴影栏,即“家”、“健康与美容”):
这是产品和类别的类别:
public class Product
{
public int Id { get; set; }
public string Barcode { get; set; }
[Required]
public string Name { get; set; }
public string Description { get; set; }
[Required]
public Byte[] Image { get; set; }
[Required]
public Decimal Price { get; set; }
[Required]
public bool ShowOnIndex { get; set; }
}
public class Category
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public Byte[] Image { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
如何将
产品
对象中的类别名称
值与正确的类别Id
相匹配 我认为您需要使用saveChangesSync()创建一个事务作用域和保存类别,然后才能获取新ID并在产品关系中使用。看到这个帖子了吗
我想我可以在一个循环中为每个产品添加它们所属的正确类别,我是这样做的:
public static async Task SaveProducts()
{
foreach (var category in CategoriesList)
{
foreach (var product in ProductsList)
{
if (product.CategoryName == category.Name)
{
category.Products.Add(product);
}
}
db.Categories.Add(category);
}
await db.SaveChangesAsync();
}
如您所见,我每次添加到数据库的唯一实体是Category对象Category
。我不必单独添加产品,因为我认为Entity Framework知道类别和产品之间的一对多关系,所以当我添加类别时,Entity Framework将查看任何外键(这里是Categories类中的列表)每次for循环迭代categories列表时,它都会向数据库中的Products entity表中添加一个新的Product对象,该表中的每个Product对象都位于categories的产品列表中
public static async Task SaveProducts()
{
foreach (var category in CategoriesList)
{
foreach (var product in ProductsList)
{
if (product.CategoryName == category.Name)
{
category.Products.Add(product);
}
}
db.Categories.Add(category);
}
await db.SaveChangesAsync();
}