Ошибка при отсоединении сущностей в Entity Framework v1 - PullRequest
0 голосов
/ 12 ноября 2009

Я использую .NET 3.5 SP1. Используя VS2008 Designer, я создал сущность «Категория» на основе таблицы «Категория» и «AppUser» на основе таблицы «AppUser» и «AppUserDetail» на основе таблицы «AppUserDetail».

DB TABLES:
CREATE TABLE  [Category](
    [CategoryId] [int] NOT NULL,
    [CategoryName] [varchar](50) NOT NULL,
    PRIMARY KEY ([CategoryId])
) 
CREATE TABLE  [AppUser](
    [UserId] [int] NOT NULL,
    [UserName] [varchar](50) NOT NULL,
    [CategoryId] [int] NOT NULL,    
    PRIMARY KEY ([UserId]),
    FOREIGN KEY (CategoryId) REFERENCES Category(CategoryId) ON DELETE CASCADE
) 
CREATE TABLE AppUserDetail ( 
    DetailId        int     NOT NULL, 
    UserId      int     not null, 
    Address         varchar(2000)   not null,
    Comments        varchar(2000)   not null,   
    PRIMARY KEY ([DetailId] ),
    FOREIGN KEY (UserId) REFERENCES AppUser(UserId) ON DELETE CASCADE
)
TABLE RECORDS:
Category:   1, Category-1
AppUser:    1, User1, 1
AppUserDetail:  1, 1, Address-1, Comments-1

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

using (var context = new MyEntities()) {
    AppUser user = context.AppUserSet.Where(u => u.UserId == 1).FirstOrDefault();

    //Detach ALL entities
    foreach (var stateEntry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged)) {            
        if (!stateEntry.IsRelationship)
        context.Detach(stateEntry.Entity);
    }
}

Я получаю следующее исключение:

"System.InvalidOperationException was unhandled
  Message="The object is in a detached state. This operation cannot be performed on an ObjectStateEntry when the object is detached."
  Source="System.Data.Entity"
  StackTrace:
       at System.Data.Objects.ObjectStateEntry.get_IsRelationship()

В коде я выбираю только объекты, которые не отделены.

Скажите, пожалуйста, в чем причина этой ошибки?

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Почему вы хотите отключить все сущности?

Возможно, вы можете попытаться использовать свойство Context.MergeOption для непосредственного получения списка отсоединенных объектов, поэтому вам не нужно их отсоединять.

См: http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

Davide

0 голосов
/ 12 ноября 2009

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

Не могли бы вы изменить свой код, чтобы игнорировать удаленные элементы?

т.е:

foreach (var stateEntry in context.ObjectStateManager.GetObjectStateEntries(
     EntityState.Added | EntityState.Modified | EntityState.Unchanged
)) {                    
   if (!stateEntry.IsRelationship)        
       context.Detach(stateEntry.Entity);    
}

Алекс

0 голосов
/ 12 ноября 2009

Стесняюсь спросить, зачем ты это делаешь, но:

Когда вы отсоединяете сущность, весь граф связанных сущностей отсоединяется. Итак, позже в вашем цикле вы переходите к отключению одной из этих связанных сущностей, и она уже была неявно отсоединена более ранней итерацией.

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