EF InsertOrUpdate со строкой PK - PullRequest
       21

EF InsertOrUpdate со строкой PK

0 голосов
/ 10 октября 2011

Если бы у меня был CurrencyId, я бы сделал что-то вроде этого:

 public void InsertOrUpdate(Currency entity)
        {
            if (entity.CurrencyId == default(int))
            {
                // New entity
                this.dbset.Add(entity);
            }
            else
            {
                // Existing entity
                this.context.Entry(entity).State = EntityState.Modified;
            }
        }

Но я использую строку CurrencyCode в качестве PK, и я хотел бы иметь возможность добавить или изменить ее.Поэтому я должен проверить, существует ли CurrencyCode в БД или нет.Как мне это сделать?

Добавление новой сущности - это нормально, но если я пытаюсь изменить:

 public void InsertOrUpdate(Currency entity)
        {
            if (GetByCurrency(entity.CurrencyCode) == null)
            {
                // New entity
                this.dbset.Add(entity);
            }
            else
            {
                // Existing entity
                this.context.Entry(entity).State = EntityState.Modified;
            }
        }

public Currency GetByCurrency(string currencyCode)
{
    return this.dbset.Find(currencyCode);
}

Я получаю

Объектс тем же ключом уже существует в ObjectStateManager.ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

in

this.context.Entry(entity).State = EntityState.Modified;

1 Ответ

1 голос
/ 10 октября 2011

Это потому, что когда вы выполняете поиск, он возвращает объект и сохраняет копию в кэше.Затем вы добавляете новую копию, поэтому их две.

Вместо этого вы делаете одну из двух вещей.Вы либо изменяете копию, возвращаемую поиском, если можете предположить, что CurrencyCode == null означает, что ее нет в базе данных, затем просто добавьте ее или присоедините.*

var currency = GetByCurrency(entity.CurrencyCode);

if (currency == null)
     this.dbset.Add(entity);
else
     currency.Something = entity.Something;
...