首页 > 解决方案 > EF - 多对多插入

问题描述

我必须在一张表和带有两个 FK 的多对多表中插入记录。

我有: 产品 1<=>n 产品_供应商 n<=>1 供应商

产品:ID、名称、代码 Products_Supplier:ID、ID_Products、ID_Supplier、可用性、活动、价格、品牌 供应商:ID、名称、站点

供应商列表已包含数据,无需添加任何内容。

我必须在 Product 和 Product_Supplier 中添加数据,其中 Product_Supplier 需要添加产品的 ID 以及我要添加的数据:可用性、活动和价格。Product_Supplier 还需要供应商的 ID。这是我到目前为止所做的,但它给出了验证错误:

                    Products_Supplier.ID_Supplier= supplier.Id;

                    Products_Supplier.Products.Name= record.productsVM.Name;  //insert product name
                    Products_Supplier.Availability = record.productsVM.Availability; //here shud insert availability of the product inserted before
                    Products_Supplier.Active = record.productsVM.Active;
                    Products_Supplier.Brand = record.productsVM.Brand;
                   
                    dbContext.Products_Supplier.Add(Products_SupplierObj);
                    dbContext.SaveChanges();

如果有任何疑问,请询问他们。

标签: c#entity-frameworkmany-to-many

解决方案


如果您遵循实体框架约定,您将拥有这样的类

class Product
{
    public int Id {get; set;}
    public string Name {get; set;}
    ... // other properties

    // Every Product is supplied by zero or more Suppliers (many-to-many)
    public virtual ICollection<Supplier> Suppliers {get; set;}
}

class Supplier
{
    public int Id {get; set;}
    public string Name {get; set;}
    ... // other properties

    // Every Supplier supplies zero or more Products (many-to-many)
    public virtual ICollection<Product> Products{get; set;}
}

在实体框架中,表的列由非虚拟属性表示。虚拟属性表示表之间的关系:一对多、多对多、...

因为你virtual ICollection<...>在关系的两边都使用,实体框架知道你设计了一个多对多关系,并且会为你创建联结表,即使你没有提到它。

现在显然您有一个现有的供应商和现有的产品,并且您希望供应商提供此产品:只需将其添加到virtual ICollection<...>

Supplier supplier = dbContext.Suppliers.Where(...).FirstOrDefault();
Product product = dbContext.Products.Where(...).FirstOrDefault();

// The Supplier will supply this product.
supplier.Products.Add(product);

// or the Product will be supplier by the supplier:
product.Suppliers.Add(supplier);

可能是属性 Products 为空。在这种情况下:

supplier.Products = new Product[] {product};

如果您想添加新产品并让供应商提供:

supplier.Products.Add(new Product
{
    Name = ...,
    ... // other Product properties
});

不要填写主键或外键。当您 SaveChanges 时,它们将由数据库填充


推荐阅读