я пытался несколько вещей:Как устранить нарушение основного ключа Framework Entity Framework на INSERT?
- Прикрепление данных в контексте
- вручную изменения EDMX файла (здесь это source)
- вручную получать ForeignKey объекта с (
data.RTMS_GsmOperator = Context.RTMS_GsmOperator.FirstOrDefault(c => c.Id == data.GsmOperatorId);
), а затем SaveChanges
Вот код для варианта 1:
data.Id = GetMaxId(data)
Context.Attach(data); //Here I attached it
Context.RTMS_PackageApplication.AddObject(data);
Context.SaveChanges(); //I get the error here
Вот код Вариант 3:
data.Id = GetMaxId (данные)
data.RTMS_GsmOperator = Context.RTMS_GsmOperator.FirstOrDefault(c => c.Id == data.GsmOperatorId); //Here
data.RTMS_Machine = Context.RTMS_Machine.FirstOrDefault(c => c.Id == data.MachineId); //Here
Context.RTMS_PackageApplication.AddObject(data);
Context.SaveChanges(); //I get the error here
None выше работал!
Примечание: Ни один из идентификаторов не автоинкрементный.
Когда я запускаю код ниже:
public RTMS_PackageApplication Insert(RTMS_PackageApplication data)
{
using (var Context = base.RtmsEntites)
{
//Since, its not auto-incremental, I do it manually.
data.Id = GetMaxId(data)
Context.RTMS_PackageApplication.AddObject(data);
Context.SaveChanges(); //I get the error here
}
}
Ошибка:
Violation of PRIMARY KEY constraint 'PK_GsmOperator'. Cannot insert duplicate key in object 'dbo.RTMS_GsmOperator'. The duplicate key value is (1).
The statement has been terminated.
Если вы должны знать, вот GetMaxId
метод:
private int GetMaxId(RTMS_PackageApplication data)
{
int Result = 1;
var Temp =
base.RtmsEntites.RTMS_PackageApplication.AsQueryable().OrderByDescending(u => u.Id).
FirstOrDefault();
if (Temp != null)
Result = Temp.Id + 1;
return Result;
}
Что касается ауто- инкрементальный; проблема находится на GsmOperatorId
(таблица данных внешнего ключа), и данные УЖЕ там, я просто хочу добавить Id в таблицу PackageApplciation
. Таким образом, я НЕ пытается добавить новый GsmOperator
только PackageApplication
ЭФ пытается ВСТАВИТЬ GsmOperator и Machine объектов, а также. Но почему? Я даже повторил его, как в одном из ответов ниже.
Как это исправить?
Вариант 1 или 3 должен быть успешным. Можете ли вы показать полный код, как вы пробовали эти два решения? – Slauma
Я добавил код в свой вопрос. –
Как вы управляете временем жизни контекста 'base.RtmsEntites'? По-видимому, вы не создаете новый в блоке 'using', а используете существующий. (Это выражение 'using' очень * странно.) По какой-то причине объект' data.RTMS_GsmOperator' находится в состоянии 'Added', и это могло произойти намного раньше, если у вас есть контекст с большим сроком службы. – Slauma