2017-04-12 84 views
0

实体框架的核心,错误的Postgres违反外键约束

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?我需要为每个表执行Add和SaveChanges吗? :(

+0

你没在你的例子中甚至没有设置Id,你如何期望它使用一个ID作为关系?ID只会在模型保存后生成。或者你必须在分配它之前保存或使用导航属性 – Tseng

回答

1

使用导航属性或之前保存,所以EF核心可以填充主键(发生在实体只被保存后)。

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

这将首先创建产品,然后创建电话分机? – 001

+1

是的,因为EF Core会看到指定的产品尚不存在。如果您之前已加载过产品(因此它有一个ID),那么产品将不会再次创建 – Tseng

相关问题