Я использую Repository в слое данных содержит следующий метод, предложенный chrisb для обновления лиц, доступ к коду первичного ключ первого перед обновлением:Entity Framework: Обновление Entity с составным первичным ключом
var entry = _dbContext.Entry<T>(entity);
// Retreive the Id through reflection
var pkey = _dbset.Create().GetType().GetProperty("Id").GetValue(entity);
if (entry.State == EntityState.Detached)
{
var set = _dbContext.Set<T>();
T attachedEntity = set.Find(pkey); // You need to have access to key
if (attachedEntity != null)
{
var attachedEntry = _dbContext.Entry(attachedEntity);
attachedEntry.CurrentValues.SetValues(entity);
}
else
{
entry.State = EntityState.Modified; // This should attach entity
}
}
вопрос заключается в том, как использовать этот метод с составным первичным ключом: т.е. когда первичный ключ состоит из двух или более столбцов.
Обновление: моя проблема связана с методом Find(), например, когда я передаю ему две переменные как составной PK, значение attachEntity равно null, и я получаю исключение: «Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом ».
Update2: здесь полный код метода после модификации
public virtual void Update(T entity, params Object[] pkey)
{
var entry = _dbContext.Entry<T>(entity);
if (entry.State == EntityState.Detached)
{
var set = _dbContext.Set<T>();
T attachedEntity = set.Find(pkey); // You need to have access to key
if (attachedEntity != null)
{
var attachedEntry = _dbContext.Entry(attachedEntity);
attachedEntry.CurrentValues.SetValues(entity);
}
else
{
entry.State = EntityState.Modified; // This should attach entity
}
}
}
Спасибо.
Можете ли вы показать нам новый код, в котором вы передаете 2 переменных для поиска()? – Colin
ОК, я удалил оператор отражения и передал переменные в качестве параметров методу, содержащему код, поэтому код, вызывающий этот метод, передает ему имя первичных ключевых частей. Это работа, но она доступна для меня, потому что я вызываю этот метод из уровня сервиса WCF. – Hussein
Просто добавила эту технику к моему в то же время, когда вы отправили свой комментарий! Работает ли он сейчас? – Colin