Прикрепление отдельных записей с тем же ключом - PullRequest
1 голос
/ 15 августа 2011

Я использую Code First Entity Framework 4.1.Я использую две сущности: «Состояние» и «Пользователь».Каждая запись состояния имеет свойства «CreatedBy» User и «ModifiedBy», как указано ниже.

public class State {
    public virtual User CreatedBy { get; set; }
    public virtual User ModifiedBy { get; set; }
}

Сущность User не имеет обратной ссылки на сущность State, то есть State => User is "Однонаправленный».

Проблема возникает, когда существует отдельный объект State, имеющий такие же свойства пользователя, как «CreatedBy» и «ModifiedBy».Когда я пытаюсь присоединить Entity State к dbContext, EntityFramework жалуется, что дубликат записи обнаружен ObjectStateManager.Я искал простое решение для этой проблемы.

1 Ответ

0 голосов
/ 15 августа 2011

Одним из решений было бы проверить, находится ли User с тем же ключом в контексте, и если да, замените отдельные ссылки User в вашей сущности State объектами, которые присоединены к контексту.Скажем, state - это новая сущность State для присоединения:

if (state.CreatedBy != null)
{
    var attachedCreatedBy = context.ChangeTracker.Entries()
        .Where(e => e.Entity is User
                 && e.Cast<User>().Entity.Id == state.CreatedBy.Id)
        .Select(e => e.Entity)
        .SingleOrDefault();

    if (attachedCreatedBy != null)
        state.CreatedBy = attachedCreatedBy;
}

if (state.ModifiedBy != null)
{
    var attachedModifiedBy = context.ChangeTracker.Entries()
        .Where(e => e.Entity is User
                 && e.Cast<User>().Entity.Id == state.ModifiedBy.Id)
        .Select(e => e.Entity)
        .SingleOrDefault();

    if (attachedModifiedBy != null)
        state.ModifiedBy = attachedModifiedBy;
}

context.States.Attach(state); // now it should not throw an exception anymore

Ну, я бы не назвал это "простым решением".Но я не знаю другого.Если бы у вас были свойства внешнего ключа CreatedById и ModifiedById в State, это стало бы проще.Вы можете просто установить свойства навигации CreatedBy и ModifiedBy на null и установить в свойствах внешнего ключа только идентификаторы связанных пользователей.

...