2017-09-11 14 views
0

请有人指导我如何在不创建行的副本的情况下将数据保存并更新到数据库中。每当我保存它就会创建一个新记录,而不是更新当前的记录。所以,我的问题是,有什么不对的模型创建或模型 这里关系年代车型每次我保存实体框架都留下旧数据并为模型的ICollection属性创建新的

public class Order 
{ 
    public Guid ID { get; set; } 
    public string Number { get; set; } 

    public string FromLoc { get; set; } 
    public string ToLoc { get; set; } 
    public Division Devision { get; set; } = Division.None; 
    public DateTime OrderDate { get; set; } = DateTime.Now; 
    public OrderPriority Priority { get; set; } = OrderPriority.None; 
    public bool IsSubmitted { get; set; } 
    public OtherField Others { get; set; } 

    public ICollection<OrderDetails> Details { get; set; } //Problem is here 
} 
public class OrderDetails 
{ 
    public int ID { get; set; } 
    public string ProductCode { get; set; } 
    public int WHStock { get; set; } 
    public int BranchStock { get; set; } 
    public int Quantity { get; set; } 

} 

我使用此机型配置流畅的API的配置代码

public class OrderConfig : EntityTypeConfiguration<Order> 
{ 
    public OrderConfig() 
    { 
     ToTable("tblOrderHead"); 
     HasKey(k=>new { k.ID,k.Number}); 

     Property(p=>p.FromLoc).IsRequired(); 
     Property(p=>p.ToLoc).IsRequired(); 


     HasMany(m => m.Details); 
    } 
} 

然后将此是保存功能

private async void Save() 
    { 
     OtherField comField = new OtherField 
     { 
      CreateBy = frmWelcome._User.UserName, 
      UpdateBy = frmWelcome._User.UserName 
     }; 

     var orderDetails = new List<OrderDetails>(); 
     Task<Order> taskFindOrder = new Task<Order>(()=> { 
      //details 
      foreach (OrderDetailsViewModel item in orderDetailsViewModelBindingSource) 
      { 
       OrderDetails details = new OrderDetails 
       { 
        ProductCode = item.ProdCode, 
        BranchStock = item.BRStk, 
        WHStock = item.WHStk, 
        Quantity = item.Quantity 

       }; 
       orderDetails.Add(details); 
      } 
      return con.Orders.FirstOrDefaultAsync(x => x.Number == txtOrderNumber.Text).Result; ; 
     }); 
     taskFindOrder.Start(); 
     var find = await taskFindOrder; 

     if (find != null) 
     { 
      //run update 
      find.Details.Clear(); 
      find.Details = orderDetails; 
      find.Others.UpdateBy = frmWelcome._User.UserName; 
      find.Others.UpdateTimeStamp = DateTime.Now; 
     } 
     else 
     { 
      var order = new Order 
      { 
       ID = Guid.NewGuid(), 
       FromLoc = frmWelcome._LocationCode, 
       ToLoc="", 
       Number = txtOrderNumber.Text, 
       Others = comField, 
       Details=orderDetails 
      }; 
      con.Orders.Add(order); 
     } 
     try 
     { 
      var result = await con.SaveChangesAsync(); 
      if (result != 0) 
      { 
       new Msg("Successfull", "Record successfully saved.", Msg.MsgType.Success); 
      } 
      else 
      { 
       new Msg("Failed!", "Record failed to save into database.", Msg.MsgType.Warning); 
      } 
     } 
     catch (Exception ex) 
     { 
      new Msg("Error!", ex.Message, Msg.MsgType.Error); 
     } 

    } 

,当保存它的确定,但是当它运行更新

这是保存结果后,请查看结果太

enter image description here

+0

不'一些自动化的方法OrderDetailsViewModel'类包含'ID'属性(类似于'OrderDetails')? –

+0

不,它不是这里的类

 public class OrderDetailsViewModel { public string ProdCode { get; set; } public string RefNo { get; set; } public string Description { get; set; } public string UOM { get; set; } public int WHStk { get; set; } public int BRStk { get; set; } public int Quantity { get; set; } public string Remark { get; set; } } 
@Ivan Stoev – Siraj

+0

然后没有办法确定现有的'OrderDetails'记录被更新(除了你有一些次要的唯一性,在这种情况下你必须自己编写逻辑)。一般来说,除了添加新的订单明细记录之外,EF没有别的选择。并且它保留了带有空FK的旧记录,因为该关系默认为* optional *。如果你想删除旧记录,那么就建立关系* required *('HasMany(m => m.Details).WithRequired();')。但确保首先删除表中具有'NULL' FK的所有记录。 –

回答

0

我不知道的是,这是正确的方式或没有,但时间是它解决问题。任何人有任何想法,这件事请你跟我分享一下我当时就是下面

private async void Save() 
    { 
     OtherField comField = new OtherField 
     { 
      CreateBy = frmWelcome._User.UserName, 
      UpdateBy = frmWelcome._User.UserName 
     }; 

     var orderDetails = new List<OrderDetails>(); 
     Task<Order> taskFindOrder = new Task<Order>(()=> { 
      //details 
      foreach (OrderDetailsViewModel item in orderDetailsViewModelBindingSource) 
      { 
       OrderDetails details = new OrderDetails 
       { 
        ProductCode = item.ProdCode, 
        BranchStock = item.BRStk, 
        WHStock = item.WHStk, 
        Quantity = item.Quantity 

       }; 
       orderDetails.Add(details); 
      } 
      return con.Orders.FirstOrDefaultAsync(x => x.Number == txtOrderNumber.Text).Result; ; 
     }); 
     taskFindOrder.Start(); 
     var find = await taskFindOrder; 

     if (find != null) 
     { 
      //run update 
      var del = find.Details; //get all previous details 
      con.OrderDetails.RemoveRange(del); //addedd this line here to delete 
      find.Details = orderDetails; //assign the new value 
      find.Others.UpdateBy = frmWelcome._User.UserName; 
      find.Others.UpdateTimeStamp = DateTime.Now; 
     } 
     else 
     { 
      var order = new Order 
      { 
       ID = Guid.NewGuid(), 
       FromLoc = frmWelcome._LocationCode, 
       ToLoc="", 
       Number = txtOrderNumber.Text, 
       Others = comField, 
       Details=orderDetails 
      }; 
      con.Orders.Add(order); 
     } 
     try 
     { 
      var result = await con.SaveChangesAsync(); 
      if (result != 0) 
      { 
       new Msg("Successfull", "Record successfully saved.", Msg.MsgType.Success); 
      } 
      else 
      { 
       new Msg("Failed!", "Record failed to save into database.", Msg.MsgType.Warning); 
      } 
     } 
     catch (Exception ex) 
     { 
      new Msg("Error!", ex.Message, Msg.MsgType.Error); 
     } 

    } 

它的工作,但我还是不满意,这种方法有一定的实体框架

相关问题