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
Ceest le résultat après sauvegarde, s'il vous plaît voir le résultat trop
Est-ce que 'OrderDetailsViewModel' classe contient la propriété 'ID' (similaire à' OrderDetails')? –
Non ce n'est pas la classe
@Ivan Stoev – SirajEnsuite, 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. –