Visual Studio 2008 LINQ удалить строки не работает - PullRequest
1 голос
/ 18 мая 2011

Я использую Visual Studio 2008 с .NET Framework 3.5.

Я пытаюсь сделать то, что, как я думал, будет простым удалением некоторых строк с использованием LINQ для сущностей.

Iу меня есть простая база данных базы данных SQL Server, и я использую Data Entity Framework для доступа к ней.Я ничего не сделал с поведением по умолчанию, созданным в EDMX.

Я пытаюсь следующий код:

            myDB.Dispose();
            myDB = new EChODatabaseConnection();


            //get our equipment list of requested equipment
            var OldEquip = from u in myDB.dbEquipmentRequestedSet
                                          where u.iRequestID == requestID
                                          select u;
            myDB.DeleteObject(OldEquip);

            myDB.SaveChanges();

Он попадает в db.DeleteObject (OldEquip) и генерирует следующую ошибку:

"Невозможно удалить объект, поскольку он не был найден в ObjectStateManager."

Я проверил, что в OldEquip что-то есть, прежде чем строка кода будетВыполнено.

Я добавил первые две строки кода (Dispose и new) на случай, если возникла проблема с предыдущим кодом.

EDIT dbEquipmentRequestedSet выглядит такthis:

iRequestID  (in db an int)
sCode       (in db a varchar(50))
SCodePrefix (in db a varchar(10))

Я использую составной первичный ключ на основе iRequestID и sCode.

EDIT2 Чтобы выяснить, почти во всех случаях, запрос OldEquip приведет кболее одного результата.

Из ответов на данный момент видно, что мне придется вручную проходить каждую запись для удаления.

Есть ли более элегантное решение?Может быть, с помощью хранимой процедуры?

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Похоже, вы хотите удалить несколько. Попробуйте это:

var OldEquip = (from u in myDB.dbEquipmentRequestedSet
                            where u.iRequestID == requestID
                            select u)
                    .ToList();

foreach(var item in OldEquip)
{
    myDB.DeleteObject(item);
}

Вероятная причина, если DeleteObject принимает объект, который должен быть сущностью, содержащейся в ObjectStateManager. Ваш код в настоящее время передал ему ObjectQuery<T>, которого нет в ObjectStateManager.

Больше на этом MSDN сообщении на форуме .

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

У меня есть несколько методов расширения, которые я использую для удаления нескольких объектов одновременно, если вы хотите их использовать:

    public static void DeleteAll(this ObjectContext context, IEnumerable<object> collection)
    {
        foreach (var item in collection.ToList())
        {
            context.DeleteObject(item);
        }
    }

    public static void DeleteAll<TEntity>(this ObjectSet<TEntity> context, IEnumerable<TEntity> collection) where TEntity : class
    {
        foreach (var item in collection.ToList())
        {
            context.DeleteObject(item);
        }
    }
0 голосов
/ 18 мая 2011

OldEquip в этом случае имеет тип IQueryable. Вы можете удалить только реальные объекты, поэтому вам придется изменить оператор LINQ на что-то вроде:

var OldEquip = (from u in myDB.dbEquipmentRequestedSet
                where u.iRequestID == requestID
                select u).First();

или если запрос возвращает несколько значений, переберите все результаты в IQueryable с помощью foreach и удалите все элементы по отдельности.

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