Сообщение об ошибке: Прикрепление объекта типа не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа.Прикрепление объекта типа не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа
Вопрос: Как связать объект таким же образом, как показано в методе AttachActivity в коде ниже?
Я должен предположить, что часть сообщения об ошибке «другая сущность» выше относится к объекту, который существует в памяти, но выходит за рамки (??). Я отмечаю это потому, что локальное свойство DBSet для типа сущности, которое я пытаюсь прикрепить, возвращает ноль.
Я уверен, что сущности не существуют в контексте, потому что я просматриваю код и наблюдаю за контекстом по мере его создания. Объекты добавляются в несколько строк сразу после создания dbcontext.
тестирования Am для прикрепленных лиц, как указано здесь: what is the most reasonable way to find out if entity is attached to dbContext or not?
Глядя на местных жителях в окне местных жителей визуальной студии я не вижу сущности типа деятельности (независимо от ID), за исключением того, что я пытаюсь прикрепить.
Код выполняется в следующем порядке: Try -> ModifyProject -> AttachActivity
код не в AttachActivity на комментировал линии.
Обратите внимание на код между отладочными комментариями, которые будут выдаваться, если какие-либо объекты были добавлены в контекст.
private string AttachActivity(Activity activity)
{
string errorMsg = ValidateActivity(activity); // has no code yet. No. It does not query db.
if(String.IsNullOrEmpty(errorMsg))
{
// debug
var state = db.Entry(activity).State; // Detached
int activityCount = db.Activities.Local.Count;
int projectCount = db.Activities.Local.Count;
if (activityCount > 0 || projectCount > 0)
throw new Exception("objects exist in dbcontext");
// end debug
if (activity.ID == 0)
db.Activities.Add(activity);
else
{
db.Activities.Attach(activity); // throws here
db.Entry(activity).State = System.Data.Entity.EntityState.Modified;
}
}
return errorMsg;
}
public int ModifyProject(Presentation.PresProject presProject, out int id, out string errorMsg)
{
// snip
foreach (PresActivity presActivity in presProject.Activities)
{
Activity a = presActivity.ToActivity(); // returns new Activity object
errorMsg = ValidateActivity(a); // has no code yet. No. It does not query db.
if (String.IsNullOrEmpty(errorMsg))
{
a.Project = project;
project.Activities.Add(a);
AttachActivity(a);
}
else
break;
}
if (string.IsNullOrEmpty(errorMsg))
{
if (project.ID == 0)
db.Projects.Add(project);
else
db.AttachAsModfied(project);
saveCount = db.SaveChanges();
id = project.ID;
}
return saveCount;
}
Это класс, новости вверх по DbContext:
public void Try(Action<IServices> work)
{
using(IServices client = GetClient()) // dbContext is newd up here
{
try
{
work(client); // ModifyProject is called here
HangUp(client, false);
}
catch (CommunicationException e)
{
HangUp(client, true);
}
catch (TimeoutException e)
{
HangUp(client, true);
}
catch (Exception e)
{
HangUp(client, true);
throw;
}
}
Я не спрашиваю: Как использовать AsNoTracking What difference does .AsNoTracking() make?
Почему Entity Framework повторно вставляет существующие объекты в мою базу данных? msdn.microsoft.com/en-us/magazine/dn166926.aspx – Colin
@Colin - хороший улов - и я подумал об этом. В моем проекте класс Project имеет свойство, которое является списком. Однако в коде отладки в AddActivity я проверяю любые объекты проекта, добавленные в контекст, и их нет. –
Sam
Пожалуйста, посмотрите мой ответ на [ASP.NET MVC. Прикрепление объекта типа «MODELNAME» не выполнено, потому что другой объект того же типа уже имеет такое же значение первичного ключа] (http://stackoverflow.com/questions/ 23201907/жерех-сетчатой MVC-прикрепление-ан-объект-в-типа-ModelName-не удалось, потому-другой-лор/39557606 # 39557606). –