2013-10-15 3 views
0

У меня есть EF объект с струнным ПК, Иной entityes, связанным с нимEF Изменить значение первичного ключа

public class E1 
{ 
    public string PK {get;set;} 
    ..... 
} 

Во время моего proccess я назначить временный ПК для всей моей структуры (E1 и связанные с ним лица), ожидающее для подтверждения документа.

Если пользователь подтверждает, я назначить definitelly ПК и обновляет базу данных всех ONCASCADE

Моя проблема, когда я пытаюсь изменить состояние E1, он бросает это исключение

недвижимости " PK 'является частью информации об объектном ключе, не может быть изменен

Как я могу это сделать, чтобы избежать этого исключения?

+5

Почему он находится в базе данных, прежде чем он будет подтвержден? – Default

+0

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

+1

Вы не можете обновить ПК с помощью EntityFramework. Если вы действительно хотите обойти это. Вы можете написать процедуру хранения и вызвать его. Но, возможно, вы могли бы изменить свою модель данных для использования Identity PK и использовать свою строку как уникальный индекс. –

ответ

1

Это старый вопрос, но я подумал, что я отвечу туда, потому что я столкнулся с аналогичной проблемой, когда мне пришлось обновить значение первичного ключа для объекта. Я выполнил команду SQL непосредственно в базе данных, чтобы обновить значение первичного ключа, а затем я удалил и повторно создал экземпляр контекста. Он отлично работал. Вот пример кода:.

if(theEntity.PKValue != newPkValue) 
{ 
    context.Database.ExecuteSqlCommand("UPDATE table SET PKValue = @p0 WHERE identifier = @p1", newPKValue, identifierValue); 
    context.Dispose(); 
    context = new ContextName(); 
    theEntity = context.tables.Single(e => e.identifier == identifierValue); 
} 

(Так как вы обновляете первичный ключ, используя прямой SQL, вы не должны иметь никаких проблем с использованием старого значения первичного ключа в качестве идентификатора, если вы должны, однако, если первичный ключевое значение - это идентификатор, не забудьте найти значение первичного ключа при сбросе объекта).

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