массовая вставка и обновление с помощью ADO.NET Entity Framework - PullRequest
1 голос
/ 06 апреля 2010

Я пишу небольшое приложение, которое много обрабатывает фиды. Я хочу использовать LINQ EF для этого, так как скорость не проблема, это однопользовательское приложение, и, в конце концов, будет использоваться только один раз в месяц.

Мои вопросы связаны с лучшим способом выполнения массовых вставок с использованием LINQ EF.

После анализа входящего потока данных я получаю список значений. Поскольку конечный пользователь может попытаться импортировать некоторые дубликаты данных, я бы хотел «очистить» данные во время вставки, а не читать все записи, делать цикл for, отклонять записи и, наконец, импортировать оставшуюся часть.

Вот что я сейчас делаю:

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

Я также получаю эту ошибку:

System.Data.UpdateException не обрабатывается
Message = "Невозможно обновить EntitySet ImportDoorAccess", так как он имеет DefiningQuery и в элементе нет элемента для поддержки текущей операции. "
Source = "System.Data.SqlServerCe.Entity"

Что я делаю не так?

Любые указатели приветствуются.

1 Ответ

2 голосов
/ 06 апреля 2010

Таким способом вы можете сделать несколько вставок.

Я видел исключение, которое вы получаете в тех случаях, когда модель (EDMX) настроена неправильно.У вас либо нет первичного ключа (EntityKey в терминах EF) для этой таблицы, либо разработчик попытался угадать, каким должен быть EntityKey.В последнем случае вы увидите два или более свойств в конструкторе EDM с ключами рядом с ними.

Убедитесь, что таблица ImportDoorAccess имеет один первичный ключ, и обновите модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...