2010-02-18 3 views
2

У меня есть проект Entity Framework v1. У меня есть два объекта (Роли и Разрешения), которые имеют отношения «многие ко многим» друг с другом. Я передаю объект для сохранения (через вызов WCF, я сам не создаю его из контекста), который имеет новые записи в отношениях «многие ко многим».Как сохранить дочерние отношения в Entity Framework

Я использую «context.ApplyPropertyChanges», чтобы обновить запись новыми свойствами. Я знаю, что это не обновляет отношения. Я пытаюсь либо сделать ChildCollection .Add ( relatedObject); или ChildCollection. Атрибут ( relatedObject).

Когда я использую метод «Добавить», я получаю сообщение об ошибке: Объект нельзя добавить в ObjectStateManager, поскольку он уже имеет EntityKey. Используйте ObjectContext.Attach для присоединения объекта, имеющего существующий ключ.

Когда я использую метод «Прикрепить», я получаю сообщение об ошибке: Объект нельзя добавить в ObjectStateManager, поскольку он уже имеет EntityKey. Используйте ObjectContext.Attach для присоединения объекта, имеющего существующий ключ.

Я очень расстраиваюсь, и я думаю, что слышу, как Entity Framework смеется надо мной.

Кто-нибудь знает, как я могу это разрешить?

MyRole x = context.Roles.FirstOrDefault(a => a.RoleId == this.RoleId); 

context.ApplyPropertyChanges("Roles", this); 
foreach (MyPermission p in this.Permissions) 
{ 
    x.Permissions.Add(p); 
    //^or v 
    x.Permissions.Attach(p); 
} 
context.SaveChanges(); 

Спасибо.

ответ

2

Ничего себе. После 20 или около того прямых часов по этой проблеме я начинаю ненавидеть Entity Framework. Вот код, который сейчас работает. Я был бы признателен за любые советы о том, как сделать это более упорядоченным.

Я переработал службу WCF, так что существует только один контекст данных. Спасибо Крейгу.

Тогда я должен был изменить код на следующее:

MyRole x = context.Roles.FirstOrDefault(a => a.RoleId == this.RoleId); 

if (x == null) // inserting 
{ 
    MyApplication t = this.Application; 
    this.Application = null; 
    context.Attach(t); 
    this.Application = t; 
} 
else // updating 
{ 
    context.ApplyPropertyChanges("Roles", this); 
    x.Permissions.Load(); 

    IEnumerable<Guid> oldPerms = x.Permissions.Select(y => y.PermissionId); 
    List<MyPermission> newPerms = this.Permissions.Where(y => !oldPerms.Contains(y.PermissionId)).ToList(); 
    IEnumerable<Guid> curPerms = this.Permissions.Select(y => y.PermissionId); 
    List<MyPermission> deletedPerms = x.Permissions.Where(y => !curPerms.Contains(y.PermissionId)).ToList(); 

    // new 
    foreach (MyPermission p in newPerms) 
    { 
     x.Permissions.Add(context.Permissions.First(z => z.PermissionId == p.PermissionId)); 
    } 

    // deleted 
    foreach (MyPermission p in deletedPerms) 
    { 
     x.Permissions.Remove(context.Permissions.First(z => z.PermissionId == p.PermissionId)); 
    } 
} 
0

Вы используете одновременно несколько объектов ObjectContexts (переменная context и whereever this). Не делай этого. Это только сделает вещи очень трудными для вас. Используйте один объект ObjectContext за раз.

Я могу дать более конкретный совет, если вы покажете больше кода.

+0

контекст «это» автоматически создается ФОС сгенерированный код. Есть ли способ справиться с этим? Спасибо. – Sako73

+0

Лучше всего использовать этот контекст вместо создания нового. Снова трудно сказать, не видя кода. –

0

Я подозреваю, что вы получаете ошибки, потому что ObjectContext думает, что вы пытаетесь добавить новый объект, но обнаруживает, что у него уже есть EntityKey. Я использую метод AttachTo объекта ObjectContext для присоединения уже существующих объектов к их EntitySet. У меня были результаты, генерирующие мои объекты из заглушек или попадающих в базу данных. Таким образом, когда вы добавляете объект в свойство навигации на своем объекте, ObjectContext находит объект в его EntitySet и знает, что он является существующим, а не новым. Я не знаю, ясно ли это. Я мог бы опубликовать код, если это поможет. Как сказал г-н Штунц в своем ответе, размещение большего количества вашего кода поможет.

Смежные вопросы