INSERT语句与FOREIGN KEY约束冲突:需要将数据同时保存到两个数据库中

时间:2018-07-10 12:46:25

标签: asp.net-mvc asp.net-core-mvc

我有两个ModelsPurchaseOrdersPurchaseOrderMessages,如下所示。我正在以这样一种方式实现这一点,即用户在创建采购订单时会输入采购订单详细信息PurchaseOrderNamePurchaseOrderMessage。我将PurchaseOrderVM用于View。提交详细信息时,请使用POST方法,如下所示:

_context.Add(purchaseOrdersObj);
_context.Add(purchaseOrdersMessagesObj);
_context.SaveChanges();

我收到以下错误:The INSERT statement conflicted with the FOREIGN KEY constraint。我了解为什么我会收到该错误。这是因为我的FOREIGN KEYPurchaseOrderId还没有出现在database中,因为PurchaseOrders的数据尚未保存。

是否可以在保存Message的详细信息的同时将PurchaseOrderMessages保存到PurchaseOrders?同样,必须以这样的方式完成:一旦创建了PurchaseOrderMessages,用户将来就应该能够向同一PurchaseOrder添加更多PurchaseOrder。并且,应该保存所有PurchaseOrderMessages,以便可以将它们全部一次又一次地打印在屏幕上。

PurchaseOrders.cs

public class PuchaseOrders
{
    [Key]
    public int PurchaseOrderId { get; set; }

    public string PurchaseOrderName { get; set; }
}

PurchaseOrderMessages.cs

public class PurhcaseOrderMessages
{
    [Key]
    public int UpdateId { get; set; }

    public string Message { get; set; }

    [ForeignKey("PurchaseOrder")]
    public int PurchaseOrderId { get; set; }
    public virtual PurchaseOrder PurchaseOrder { get; set; }
}

PurchaseOrderVM.cs

public class PurchaseOrderVM
{
    public int PurchaseOrderId { get; set; }
    public string PurchaseOrderName { get; set; }
    public string Message { get; set; }
}

2 个答案:

答案 0 :(得分:1)

您需要允许EF进行连接,以便它可以按正确的顺序保存对象。不用设置id,而是设置导航属性:

purchaseOrdersMessagesObj.PurchaseOrder = purchaseOrdersObj;
_context.Add(purchaseOrdersMessageObj);
_context.SaveChanges();

答案 1 :(得分:0)

您可以通过两种解决方案来做到这一点:

第一:

public class PuchaseOrders
{
    public PuchaseOrders(){
        Messages = new List();
    }
    [Key]
    public int PurchaseOrderId { get; set; }
    public string PurchaseOrderName { get; set; }
    public ICollection<PurhcaseOrderMessages> Messages{ get; set; }
 }

PuchaseOrders purchaseOrdersObj= new PuchaseOrders(){ PurchaseOrderName = "Pla Pla"};
purchaseOrdersObj.Messages.Add(new PurhcaseOrderMessages(){Message = "Pla Pla"});
_context.Add(purchaseOrdersObj);
_context.SaveChanges();

第二:如果您在此项目中经常使用SP(存储过程),则可以编写SP来获取两个对象数据并将其插入