2014-12-03 14 views
0

Я знаю, что это было предложено раньше, но я до сих пор не в состоянии исправить следующую ошибку, при обновлении или удалении записи с каркасом объекта:Entity Framework - обновление записи

enter image description here

Я пытаюсь обновить ряд со следующим кодом, где переменная пользователя параметр, передается в метод:

savedUser = context.Users.Attach(user); 
context.Entry(user).State = EntityState.Modified; 
context.SaveChanges(); 

Я также использую то же код для обновления 2 других объектов и там работает. Кроме того, вот мой DataContext класс:

public class DataContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 

    private static DataContext instance = new DataContext(); 
    public static DataContext Instance 
    { 
     get { return DataContext.instance; } 
    } 

    public DataContext() : base("DataContext") 
    { 
    } 
} 

Любые советы?

+0

Кажется, что вы пытаетесь обновить запись, а не удалять ее. Если вы хотите удалить его, установите для этого параметра значение 'EntityState.Deleted'. –

+0

Да, ошибся. Я пытаюсь обновить его, но я получаю такую ​​же ошибку при удалении. – Orochi

ответ

2

Кажется, что объект уже прикреплен, и вам не нужно его снова присоединять. Таким образом, присоединять должна быть вызвана только тогда, когда объект уже не прилагается так:

bool isAttached = context.Users.Local.Any(x => x == user); 
if(!isAttached) 
    contect.Users.Attach(user); 

context.Entry(user).State = EntityState.Modified; 
context.SaveChanges(); 

UPDATE

При использовании существующего контекста, который использовался ранее для работы нагрузки (подключен режим), попробуйте это:

context.Users.AddOrUpdate(user); 
context.SaveChanges(); 

Или попробуйте создать новый контекст для каждой основной операции (так называемый режим отключен):

using(var newContext = new DataContext()) 
{ 
    var attachedUser = newContext.Users.Attach(user); 
    newContext.Entry(attachedUser).State = EntityState.Modified; 
    newContext.SaveChanges(); 
} 

Из моего прошлого опыта работы с EF я рекомендую использовать отключенный режим (т. Е. Создать новый DbContext для каждой крупной операции). Одна из основных причин заключается в том, что DbContext не восстанавливается должным образом из-за ошибок и исключений, и вам может понадобиться управлять своим сроком жизни вручную. В отключенном режиме вы будете уверены, что будете использовать свежий и чистый DbContext, не беспокоясь о его состоянии.

+0

Спасибо за ответ, но это все равно дает мне такую ​​же ошибку. – Orochi

+0

@Orochi Я предполагаю, что ваши сущности имеют Id. Можете ли вы изменить первую строку на следующую и посмотреть, работает ли она: 'bool isAttached = context.Users.Local.Any (x => x.Id == user.Id);' –

+0

Ну, все равно. Во всяком случае, я только что проверил что-то, и исключение фактически выбрано в этой строке: 'context.Entry (user) .State = EntityState.Modified;' – Orochi

0

Похоже, вы пытаетесь добавить запись, которая уже существует, но вы сказали, что пытаетесь удалить запись. В любом случае ссылка this может пригодиться вам.

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