Entity Framework Core,错误:Postgres 违反了外键约束

5

表格

Product
-Id (PK)
-Name

ProductExtension
-ProductId (PK)
-Notes

分配和插入记录

Product product = new Product();
product.Name = "Phone";

ProductExtension = productExtension = new ProductExtension();
productExtension.ProductId = product.Id;
productExtension.Notes = "some notes";

//Add and save
context.Products.Add(product);
context.ProductExtensions.Add(productExtension);
context.SaveChangesAsync();

错误:

PostgresException: 23503: 在表“product_extension”上进行的插入或更新违反了外键约束“FK_product_extension_product_product_id”

所以产品没有先被创建,而且产品ID被分配给 productextesion.productid? 我需要为每个表执行 AddSaveChanges 吗? :(


你的示例中甚至没有设置ID,你如何期望它使用关系的ID?ID仅在模型保存后生成。要么在分配之前保存,要么使用导航属性。 - Tseng
1个回答

2

在保存实体之前使用导航属性或保存实体,这样EF Core才能填充主键(仅在实体保存后发生)。

public class ProductExtension
{
    public int ProductId { get; set; }
    public Product Product { get; set; }
    public string Notes { get; set; }
}

Now you can use

Product product = new Product();
product.Name = "Phone";

ProductExtension = productExtension = new ProductExtension();
// assign the whole model to the navigation property
productExtension.Product = product;
productExtension.Notes = "some notes";

// no need for this anymore
// context.Products.Add(product);
//Add and save
context.ProductExtensions.Add(productExtension);
context.SaveChangesAsync();

这将首先创建产品,然后创建电话分机? - 001
1
是的,因为 EF Core 会发现所分配的产品尚不存在。如果您之前已加载了该产品(因此它具有 ID),则不会再创建该产品。 - Tseng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接