У меня есть таблица SQL Server в Entity Framework ComputerLab с двумя внешними ключами с именем LabId, ComputerId и другим ключом с именем Entrance
CREATE TABLE [dbo].[ComputerLabs]
(
[LabId] INT NOT NULL,
[ComputerId] INT NOT NULL,
[Entrance] DATETIME NOT NULL,
[Exit] DATETIME NULL,
CONSTRAINT [PK_ComputerLabs]
PRIMARY KEY CLUSTERED ([ComputerId] ASC, [LabId] ASC, [Entrance] ASC),
CONSTRAINT [FK_ComputerLabs_Lab]
FOREIGN KEY ([LabId]) REFERENCES [dbo].[Lab] ([LabId]),
CONSTRAINT [FK_ComputerLabs_Computer]
FOREIGN KEY ([ComputerId]) REFERENCES [dbo].[Computer] ([ComputerId])
);
Отображение: 1
и функция, которая обновляет запись (которая соответствует данному computerId, labId и не имеет значения выхода):
public void RemoveComputerFromLab(int compId, int labId)
{
var cList = db.ComputerLabs.Where(e => !e.Exit.HasValue && e.LabId.Equals(labId)).ToList();
if (cList.Count > 0)
{
ComputerLab cL = cList.First();
cL.Exit = DateTime.Now;
db.Entry(cL).State = EntityState.Modified;
db.SaveChanges();
/* also tried:
ComputerLab cL = cList.First();
db.ComputerLabs.Attach(cL);
cL.Exit = DateTime.Now;
db.SaveChanges();
*/
}
}
SaveChanges() выдает исключение:
Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded.
но нет другого процесса, который мог бы изменить эту сущность.
То же исключение происходит, когда я пытаюсь удалить запись:
private void DeleteComputerLab(int compId, int labId, DateTime entrance)
{
var entity = db.ComputerLabs.Find(labId, compId, entrance);
lab.ComputerLabs.Remove(entity);
//db.Entry(entity).State = EntityState.Deleted; -not working either
db.SaveChanges();
}
Что я здесь делаю не так?
Покажите, пожалуйста, как вы сопоставили ComputerLabs с классом сущности. Бьюсь об заклад, что EF не знает о составном первичном ключе.
@GertArnold Я добавил изображение сопоставления к сообщению, это сопоставление вы имели в виду?





Я протестировал ваш код - у меня он работает нормально. Одно замечание - нет необходимости устанавливать свойство
StateнаModified(вRemoveComputerFromLab). Вот код, который я использовал.