【问题标题】:Entity Framework Core, error Postgres violates foreign key constraintEntity Framework Core,错误 Postgres 违反外键约束
【发布时间】:2017-09-07 15:35:26
【问题描述】:

表格

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 仅在模型保存后生成。您必须在分配之前保存或使用导航属性

标签: c# database postgresql asp.net-core entity-framework-core


【解决方案1】:

使用导航属性或之前保存,因此 EF Core 可以填充主键(仅在保存实体之后发生)。

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

现在你可以使用了

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();

【讨论】:

  • 这会先创建产品再创建电话分机?
  • 是的,因为 EF Core 将看到分配的产品尚不存在。如果您之前已加载产品(因此它有一个 id),则不会再次创建产品
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 2021-02-14
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多