一起考慮以下實體Asp.Net的WebAPI的OData V4 - 保存實體與相關實體
public class Supplier
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
public int? SupplierId { get; set; }
public virtual Supplier Supplier { get; set; }
}
由於每供應商的實體上面的代碼可以有零個或更多產品。 在上述實體中,ID是由實體框架自動生成的。
我使用OData的V4客戶端代碼生成器。
客戶端代碼:
Supplier s = new Supplier{...}
OdataContext.AddToSuppliers(s);
Product p = new Product{...}
p.SupplierId = s.Id;
OdataContext.AddToProduct (p);
OdataContext.SaveChanges();
供應商控制器:
public async Task<IHttpActionResult> Post(Supplier supplier)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Supplier.Add(supplier);
await db.SaveChangesAsync();
return Created(supplier);
}
產品控制器:
public async Task<IHttpActionResult> Post(Product product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Products.Add(product);
await db.SaveChangesAsync();
return Created(product);
}
當我保存我收到一條錯誤消息的變化:
INSERT語句衝突與外鍵約束。
錯誤的原因是Product
實體沒有SupplierId
還沒有它作爲數據庫生成的密鑰。
所以,我怎麼能添加SupplierId
到Product
實體在保存記錄? 任何人都可以幫我解決這個問題嗎?
是的,我同意,這個問題是錯誤的。現在我編輯了這個問題。在你的例子中,你是這樣做的:'s.ProductId = p.ProductId;'據我所知,仍然'p.ProductId'沒有正確的值?那麼這個任務如何工作?它會從數據庫序列獲得價值嗎?你能解釋一下嗎? – Rahul
我修改了代碼並運行解決方案,但仍然收到相同的錯誤。 > INSERT語句與FOREIGN KEY約束「FK_dbo.Product_dbo.Supplier_SupplierId」衝突。數據庫「DBContext」,表「dbo.Supplier」,列'Id'發生衝突。 該聲明已被終止。我調試並注意到供應商是在數據庫中創建的,而不是產品。 – Rahul