2017-09-11 4 views
0

Quelqu'un peut-il me guider comment puis-je sauvegarder et mettre à jour les données dans la base de données sans créer de copie de ligne. Chaque fois que j'enregistre, je crée un nouvel enregistrement à la place de celui en cours. Donc, ma question est, est-il quelque chose de mal dans la création de modèle ou de relation entre le modèle Voici les modèlesChaque fois que je sauvegarde l'infrastructure quitte les anciennes données et crée une nouvelle propriété ICollection pour un modèle

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; } 

} 

J'utilise API couramment pour la configuration du modèle est ici le code de configuration

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

Et ce est fonction de sauvegarde

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

    } 

et quand enregistrez-le est ok, mais quand il est exécuté la mise à jour

Ce

est le résultat après sauvegarde, s'il vous plaît voir le résultat trop

enter image description here

+0

Est-ce que 'OrderDetailsViewModel' classe contient la propriété 'ID' (similaire à' OrderDetails')? –

+0

Non ce n'est pas la classe

 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

Ensuite, il n'y a aucun moyen d'identifier l'enregistrement 'OrderDetails' existant à mettre à jour (sauf que vous avez une unicité secondaire, auquel cas vous devez écrire la logique vous-même). En général, EF n'a pas d'autre choix que d'ajouter de nouveaux enregistrements de détails de commande. Et il laisse les anciens enregistrements avec des FK null, car la relation est * facultative * par défaut. Si vous voulez que les anciens enregistrements soient supprimés, faites la relation * required * ('HasMany (m => m.Détails) .WithRequired();'). Mais assurez-vous d'abord de supprimer tous les enregistrements de la table ayant FULL NULL. –

Répondre

0

Je ne sais pas est-ce est une façon correcte ou non, mais pour l'être temps de résoudre le problème. Quelqu'un at-il une idée à ce sujet s'il vous plaît faire partager avec moi ce que je n'est au-dessous

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

    } 

Il travaille, mais je ne suis toujours pas satisfait de cette approche, il est doit être une approche Automatiser par Entity Framework