insertion en bloc et mise à jour avec ADO.NET Entity Framework

.net-3.5 bulkinsert c# entity-framework

Question

J'écris une petite application qui fait beaucoup de traitement des aliments pour animaux. Je souhaite utiliser LINQ EF pour cela car la vitesse n'est pas un problème, il s'agit d'une application pour utilisateur unique et, à la fin, ne sera utilisée qu'une fois par mois.

Mes questions portent sur la meilleure façon de réaliser des insertions en masse avec LINQ EF.

Après avoir analysé le flux de données entrant, je me retrouve avec une liste de valeurs. Étant donné que l’utilisateur final peut essayer d’importer des données en double, je souhaite «nettoyer» les données lors de l’insertion plutôt que de lire tous les enregistrements, de créer une boucle for, de rejeter les enregistrements, puis d’importer le reste.

C'est ce que je suis en train de faire:

DateTime minDate = dataTransferObject.Min(c => c.DoorOpen);
DateTime maxDate = dataTransferObject.Max(c => c.DoorOpen);

using (LabUseEntities myEntities = new LabUseEntities())
{
    var recCheck = myEntities.ImportDoorAccess.Where(a => a.DoorOpen >= minDate && a.DoorOpen <= maxDate).ToList();
    if (recCheck.Count > 0)
    {
        foreach (ImportDoorAccess ida in recCheck)
        {
            DoorAudit da = dataTransferObject.Where(a => a.DoorOpen == ida.DoorOpen && a.CardNumber == ida.CardNumber).First();
            if (da != null)
                da.DoInsert = false;
        }
    }

    ImportDoorAccess newIDA;
    foreach (DoorAudit newDoorAudit in dataTransferObject)
    {
        if (newDoorAudit.DoInsert)
        {
            newIDA = new ImportDoorAccess
            {
                CardNumber = newDoorAudit.CardNumber,
                Door = newDoorAudit.Door,
                DoorOpen = newDoorAudit.DoorOpen,
                Imported = newDoorAudit.Imported,
                RawData = newDoorAudit.RawData,
                UserName = newDoorAudit.UserName
            };
            myEntities.AddToImportDoorAccess(newIDA);
        }
    }
    myEntities.SaveChanges();
}

Je reçois aussi cette erreur:

System.Data.UpdateException n'a pas été gérée
Message = "Impossible de mettre à jour EntitySet 'ImportDoorAccess' car il contient une DefiningQuery et qu'aucun élément n'existe dans l'élément prenant en charge l'opération en cours."
Source = "System.Data.SqlServerCe.Entity"

Qu'est-ce que je fais mal?

Tous les pointeurs sont les bienvenus.

Réponse acceptée

Vous pouvez faire plusieurs insertions de cette façon.

J'ai vu l'exception que vous obtenez dans les cas où le modèle (EDMX) n'est pas configuré correctement. Soit vous n’avez pas de clé primaire (EntityKey en termes EF) sur cette table, soit le concepteur a tenté de deviner ce que devrait être EntityKey. Dans ce dernier cas, vous verrez deux ou plusieurs propriétés dans le concepteur EDM avec les clés à côté.

Assurez-vous que la table ImportDoorAccess a une seule clé primaire et actualisez le modèle.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow