Entity Framework вставляет строку для свойства навигации, даже если найден ключ

Я использую Entity Framework. У меня есть таблица Person с внешним ключом в Table PersonCategory. Идентификатор человека — это автоматически увеличивающийся идентификатор (1,1). Каждый раз, когда я обновляю сущность человека, структура сущности вставляет строку для таблицы PersonCategory, даже если категория найдена.

Я использую первый дизайн базы данных.

class Person
{
  public string Name {get;set}
  public PersonCategory {get;set;}
}

class PersonCategory
{
  public int ID {get;set}
  public string Name{get;set;}
}

person Jey    schedule 28.08.2012    source источник


Ответы (3)


Сначала вам нужно прикрепить существующий PersonCategory к контексту;

var myPersonCat = new PersonCategory { ID = 1, Name = "Foo" };
var myPerson = new Person { Name = "Bar", PersonCategory = myPersonCat };

context.PersonCategories.Attach(myPersonCat);    
context.People.Add(myPerson);
person Eranga    schedule 28.08.2012
comment
Я использую шаблон универсального репозитория. Я пробовал таким образом, он все еще вставляет категорию Person и обновляет для нее объект Person. Будь то обновление человека или добавление нового человека - person Jey; 30.08.2012
comment
@Jey Возможно, ты сделал это неправильно. Можете ли вы опубликовать код, который вы пробовали? - person Eranga; 30.08.2012
comment
@Jey Похоже, что каждый из ваших репозиториев использует свой собственный экземпляр ObjectContext/DbContext. Измените свою реализацию GenericRepository, чтобы использовать один контекст. - person Eranga; 30.08.2012
comment
Почему мы должны Attach(myPersonCat)? - person Blaise; 20.04.2016

Вам нужно установить State вашего PersonCategory на Unchanged, прежде чем вы сохраните свой Person

person podiluska    schedule 28.08.2012

Можете ли вы опубликовать код, который вы используете для обновления? Мне кажется, что вы добавляете нового человека каждый раз, и с категорией человека добавляется для новой записи. То, что вы хотите, это получить человека, которого вы хотите, из контекста EF, обновить нужные поля и сохранить изменения в контексте без добавления какого-либо нового элемента в вашу базу данных, таким образом, вы только изменяете существующую запись, существующие отношения будет поддерживаться. Что-то типа

var myPerson = context.People.FindbyId(personId);
myPerson.Name = "Joe";
myPerson.Age = "20";

context.SaveAllChanges();
person Giorgio Minardi    schedule 28.08.2012
comment
это происходит как при попытке вставить нового человека, так и при попытке изменить существующий. - person Jey; 30.08.2012