Обновление базы данных через анонимный тип? - PullRequest
2 голосов
/ 14 апреля 2011

Следующий код получает все строки из моей таблицы «Деятельности», которые еще не были опубликованы в Twitter. Затем он просматривает и публикует обновления Twitter для каждой из этих строк. В процессе, я хотел бы обновить базу данных, чтобы указать, что эти строки теперь "twittered".

Тем не менее, я получаю сообщение об ошибке (указано ниже) при попытке обновить это значение. Я предполагаю, что это потому, что я использую анонимный тип. Однако, если я использую полный тип, это потребует извлечения большого количества ненужных данных из базы данных.

Есть ли способ сделать это эффективно? Или это еще один случай, когда EF заставляет меня идти на компромиссы в производительности?

using (MyEntities context = new MyEntities())
{
    var activities = from act in context.Activities
                     where act.ActTwittered == false
                     select new { act.ActID, act.ActTitle, act.Category,
                     act.ActDateTime, act.Location, act.ActTwittered };

    foreach (var activity in activities)
    {
        twitter.PostUpdate("...");
        activity.ActTwittered = true; // <== Error: ActTwittered is read-only
    }
}

Ответы [ 3 ]

6 голосов
/ 14 апреля 2011

Вы можете попробовать "подход с поддельными объектами", например так:

using (MyEntities context = new MyEntities())
{
    var activities = from act in context.Activities
                     where act.ActTwittered == false
                     select new { act.ActID, act.ActTitle, act.Category,
                     act.ActDateTime, act.Location, act.ActTwittered };

    foreach (var activity in activities)
    {
        twitter.PostUpdate("...");

        // Create fake object with necessary primary key
        var act = new Activity()
        {
            ActID = activity.ActID,
            ActTwittered = false
        };

        // Attach to context -> act is in state "Unchanged"
        // but change-tracked now
        context.Activities.Attach(act);

        // Change a property -> act is in state "Modified" now
        act.ActTwittered = true;
    }

    // all act are sent to server with sql-update statements
    // only for the ActTwittered column
    context.SaveChanges();
}

Это "теоретический" код, не уверен, что он будет работать.

Редактировать

Больше не "теоретически".Я протестировал это с DbContext EF 4.1, и это работает, как описано в примере кода выше.(Поскольку DbContext является всего лишь API-оболочкой для ObjectContext, почти безопасно предположить, что он также будет работать в EF 4.0.)

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

Почему вы вызываете select new вместо возврата всего объекта. Платформа сущностей сможет обновлять свойство только в том случае, если оно правильно определено в ресурсах схемы, что, конечно, не относится к анонимному типу.

Платформа сущностей никогда не сможет определить, какой таблице и какому полю соответствует свойство.

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

Если вы просто выберите «действовать», то это должно работать.Не забудьте отправить после редактирования.

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