c# - 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();
如果有任何疑问,请询问他们。
解决方案
如果您遵循实体框架约定,您将拥有这样的类
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 时,它们将由数据库填充
推荐阅读
- javascript - 从 json 响应中查找下一个最接近的日期和时间
- python - 结合2个for循环
- python - 如何创建一个财政年度的销售累计计数器?
- python - 追加列表理解时出现 Python 错误
- ios - 无法在 iOS 15 的侧边栏列表部分中同时呈现文本视图和 DatePicker
- python - 如何将脚本分解为更小的函数并创建 main.py?
- python - 如何修复 _pickle.PicklingError: can'tpickle : 它不是同一个对象
- javascript - 查找 TensorFlow.js 训练进度
- database - 电子商务平台并发请求的系统设计
- php - 在php中替换字符串中多次出现的字符