【问题标题】:Unable to determine the principal end of the relationship ASP.NET MVC 5无法确定关系 ASP.NET MVC 5 的主体端
【发布时间】:2018-09-30 23:09:02
【问题描述】:

我目前正在使用链接到 SQL Server 数据库的 EF 6.1.3 构建 ASP.NET MVC 5 应用程序。

我的问题:当我尝试保存 2 个或更多“PurchaseInvoiceSplitsViewModel”实例时收到以下错误,仅保存 1 个时没有问题。

无法确定“WebAS.Models.PurchaseInvoiceSplits_VehicleStock”关系的主体端。 多个添加的实体可能具有相同的主键。

问题出现在_context.SaveChanges();

我的视图模型:

public class PurchaseInvoiceHeaderFormViewModel
{
    public PurchaseInvoiceHeaderFormViewModel()
    { 
        Splits = new List<PurchaseInvoiceSplitsViewModel>();  
    }      
    public List<PurchaseInvoiceSplitsViewModel> Splits  { get; set; }     
}

public class PurchaseInvoiceSplitsViewModel
{
    public PurchaseInvoiceSplits PurchaseInvoiceSplits { get; set; }
    public VehicleInformation VehicleInformation { get; set; }  
    public VehicleStock VehicleStock { get; set; }
}

我的模特:

 public class VehicleStock
 {   
    [Key]     
    public int VehicleStockId { get; set; }       
    public int VehicleInformationId { get; set; }
    public VehicleInformation VehicleInformation { get; set; }
 }

  public class PurchaseInvoiceSplits
  {
    [Key]       
    public int PurchaseInvoiceSplitsId { get; set; }
    public int? VehicleStockId { get; set; }
    public VehicleStock VehicleStock { get; set; }
  }

  public class VehicleInformation
  {
    [Key]
    public int VehicleInformationId { get; set; }
  }

控制器:

    [HttpPost]        
    public ActionResult Save(PurchaseInvoiceHeaderFormViewModel viewModel)
    {
      _context.PurchaseInvoiceHeader.Add(viewModel.PurchaseInvoiceHeader); 

      foreach (var Split in viewModel.Splits)
       {          
        Split.PurchaseInvoiceSplits.VehicleStockId =                                               
                                                    Split.VehicleStock.Id;
        Split.VehicleStock.VehicleInformationId = 
                                              Split.VehicleInformation.Id;                   

       _context.VehicleInformation.Add(Split.VehicleInformation);
       _context.VehicleStock.Add(Split.VehicleStock);        
       _context.PurchaseInvoiceSplits.Add(Split.PurchaseInvoiceSplits);
       }

      _context.SaveChanges();
      return RedirectToAction("xxx", "xxx");            
    }

我花了很长时间研究这个问题,我相信这与 EF 为模型分配临时 ID 为 0 有关。当有一个模型但似乎会导致多个模型实例化的导航/参考问题时,这很好。对其他论坛帖子的回答建议使用我尝试过但未能开始工作的临时 ID。任何帮助将不胜感激。请随时要求进一步澄清/代码 sn-ps。

【问题讨论】:

    标签: c# sql-server asp.net-mvc-5 entity-framework-6


    【解决方案1】:

    使用实体框架事务解决的问题(注意,似乎仅适用于版本 6+)。在这里找到非常有用的信息:

    Entity Framework Tutorials

    MSDN turotials

    仅需要在 Controller 中进行修改:

    [HttpPost]        
    public ActionResult Save(PurchaseInvoiceHeaderFormViewModel viewModel)
    {
     using (CustData Tcontext = new CustData())
     {
       using (DbContextTransaction transaction = 
                                           Tcontext.Database.BeginTransaction())
        { 
        try
        {
          Tcontext.PurchaseInvoiceHeader.Add(viewModel.PurchaseInvoiceHeader);
          Tcontext.SaveChanges();
    
          foreach (var Split in viewModel.Splits)
          {                                
            Tcontext.VehicleInformation.Add(Split.VehicleInformation);                                
    
            Split.VehicleStock.VehicleInformationId = Split.VehicleInformation.Id;            
    
            Tcontext.VehicleStock.Add(Split.VehicleStock);                                
    
            Split.PurchaseInvoiceSplits.VehicleStockId = Split.VehicleStock.Id;                                
    
            Split.PurchaseInvoiceSplits.PurchaseInvoiceNumberId = viewModel.PurchaseInvoiceHeader.Id;
    
            Tcontext.PurchaseInvoiceSplits.Add(Split.PurchaseInvoiceSplits);
            Tcontext.SaveChanges();
          }
    
         transaction.Commit();
       }
       catch (Exception ex)
       {
          Console.WriteLine("Error occurred." + ex);                       
       }
      }
     }
    return RedirectToAction("xxx", "xxx");            
    }
    

    我认为 .Add 出现的顺序也很重要,因此重新排列。

    【讨论】:

      【解决方案2】:

      我有同样的错误和不相似的代码设置,但是...

      我看了上面的答案,注意到底部的评论:我认为 .Add 发生的顺序也很重要,因此重新排列。

      我所做的是在我的代码中安排保存并能够消除错误。我只是想我会发布这个以供将来搜索错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        • 2013-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        相关资源
        最近更新 更多