Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将产品分配到类别,并在产品对象中将CategoryName指定为外键_C#_Sql_Sql Server - Fatal编程技术网

C# 将产品分配到类别,并在产品对象中将CategoryName指定为外键

C# 将产品分配到类别,并在产品对象中将CategoryName指定为外键,c#,sql,sql-server,C#,Sql,Sql Server,我有一个CMS系统,用户可以在其中创建一个类别对象,然后用户可以单击创建的类别并向其中添加产品对象。当用户浏览产品时,他们可以单击某个类别,该类别将CategoryId与Post请求一起发送到产品索引页。然后,“产品索引”页面获取与传递的类别Id匹配的类别对象,选择属于该类别的“产品列表”属性并显示产品类别类具有产品列表的属性 我现在有了一个CSV数据导入表单,它允许用户做同样的事情,但只需上传一个CSV文件 CSV文件数据(灰色阴影)是产品列表。注-每种产品的类别名称栏(第5阴影栏,即“家”、

我有一个CMS系统,用户可以在其中创建一个
类别
对象,然后用户可以单击创建的类别并向其中添加
产品
对象。当用户浏览产品时,他们可以单击某个类别,该类别将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();
        }