Использование EF / LINQ для копирования записи из одной таблицы в другую (архивирование записи) - PullRequest
1 голос
/ 16 апреля 2011

Не в SQL, а в C # с использованием Entity Framework: существует ли простой способ скопировать исходную запись в другую таблицу? Определения столбцов идентичны, однако целевая таблица не имеет индексов, ключей или ограничений. У меня есть этот код, и одна строка, с которой у меня возникают проблемы, помечена:

private void HandleAutos()
{
    // convert to List<auto>...
    List<Model.Auto> imports = ConvertAuto();

    // get all DB records in List<auto>...
    List<Model.Auto> current = _dbFeed.Autoes.Where(a => a.ClientID == _targetClientID && a.Active == true).ToList();

    // isolate all Inserts, Updates and Deletes...
    var existing = imports.Intersect(current, new AutoIsIn()).ToList();         // should be all autos with matching VIN & SKU  //
    var updates = existing.Intersect(current, new AutoHasChanged()).ToList();   // should be a subset of changed resords        //
    var inserts = imports.Except(current, new AutoIsIn()).ToList();             // should be all the imports not in the DB      //
    var deletes = current.Except(imports, new AutoIsIn()).ToList();             // should be all the DB records not in imports  //

    // THIS IS THE BAD LINE //
    deletes.ForEach(a => _dbFeed.AddToAutoArchives(a));  // <=======
    // -------------------- //
    deletes.ForEach(a => _dbFeed.DeleteObject(a));
    updates.ForEach(a => _dbFeed.ApplyCurrentValues("Autoes", a));
    inserts.ForEach(a => _dbFeed.AddToAutoes(a));

    _dbFeed.SaveChanges();
}

Я знаю, что могу просмотреть свои исходные записи, создать архивную запись, скопировать каждое свойство и, наконец, добавить новый объект в коллекцию ArchiveAutos и сохранить его в БД. Прежде чем я пошел по этому пути и написал метод для копирования записи из сущности Auto в сущность AutoArchive, я хотел бы проверить, есть ли уже какая-то удивительная сладость, уже испеченная.

Знаете ли вы, есть ли?

ТИА

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Вот решение, которое я придумал:

// Archive the records to be deleted...
if (_deletes.Count > 0)
{
    // ignore deletes less than 60 days old...
    var myDeletes = _deletes.Where(a => a.DateCreated <= DateTime.Now.AddDays(-60)).ToList();

    List<Model.AutoArchive> archiveList = ConvertAuto(myDeletes);
    archiveList.ForEach(a => _dbFeed.AutoArchives.Add(a));
    _dbFeed.SaveChanges();

    // Drop the records no longer in the feed...
    foreach (var d in myDeletes)
    {
        var myImages = _dbFeed.Images.Where(a => a.ParentRecordID == d.AutoID).ToList();
        myImages.ForEach(a => _dbFeed.Images.Remove(a));
    }
    myDeletes.ForEach(a => _dbFeed.Autoes.Remove(a));
    _dbFeed.SaveChanges();
}

private List<Model.AutoArchive> ConvertAuto(List<Model.Auto> deletes)
{
    List<Model.AutoArchive> aa = new List<Model.AutoArchive>();
    foreach (var a in deletes)
    {
        aa.Add(new Model.AutoArchive
        {
            ID = Guid.NewGuid(),
            Active = a.Active,
            ....
            ImageList = a.ImageList
        });
    }

    return aa;
}

Ужасно чертовски, но оно работает.(

0 голосов
/ 16 апреля 2011

Вы можете рассмотреть возможность использования хранимой процедуры для выполнения архивирования записи и просто вызвать ее из своего кода C #, что намного чище и проще, а также позволяет избежать обхода всех данных.

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