Entity Framework - Элемент с тем же ключом уже добавлен.- Ошибка при попытке определить отношение внешнего ключа - PullRequest
8 голосов
/ 29 августа 2010

У меня есть объект с отношением внешнего ключа к таблице пользователей поставщика членства asp.net.

Эта часть модели выглядит так:

alt text

Я не могу назначить отношение внешнего ключа при вставке записи таблицы Users, записи, содержащей внешний ключ, в таблицу aspnet_Users. Я получаю сообщение об ошибке:

Предмет с таким же ключом уже было добавлено.

Код, который я использую, выглядит следующим образом:

UserAdmin userToAdd = new UserAdmin();
...
userToAdd.aspnet_Users = membershipUser;
//line above OR line below
userToAdd.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("ProjectEntities.aspnet_Users", "UserId", membershipUser.UserId);

db.AddToUsers(userToAdd);
db.SaveChanges();

Проблема в том, что я прошу EF добавить новую запись таблицы aspnet_Users (запись для связанной таблицы первичного ключа), когда эта запись уже существует?

Как бы я присвоил значение внешнего ключа объекту, где запись первичного ключа уже существует?

Обновлен блок кода теста:

MembershipUser membershipUser = Membership.CreateUser("blah@blah.com", "pass", "blah@blah.com");

Entities db = new Entities();
UserAdmin newUser = new UserAdmin();
newUser.Name = "blah";
newUser.DateAdded = DateTime.Now;

Guid key = new Guid(membershipUser.ProviderUserKey.ToString());
aspnet_Users membershipUserRecord = db.aspnet_Users.Where(u => u.UserId == key).FirstOrDefault();
newUser.aspnet_Users = membershipUserRecord;
//newUser.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("Entities.aspnet_Users", "UserId", membershipUserRecord.UserId);
db.ObjectStateManager.ChangeObjectState(membershipUserRecord, EntityState.Unchanged);

db.AddToUsers(newUser);
db.SaveChanges();

Этот код генерирует ошибку:

Элемент с таким же ключом уже добавлен.

Ответы [ 2 ]

10 голосов
/ 30 августа 2010

ОК, я понял это. Как обычно, я просто совершил ошибку и сразу ее не поймал, потому что искал не в том месте.

Проблема была связана с моим наследованием таблиц и конфигурацией на уровне базы данных. У меня было поле внешнего ключа дочерней таблицы (UserAdmin), определенное как идентификатор, которое затем отображалось в моей модели как StoreGeneratedPattern = Identity. Это приводило к ошибке «Элемент с таким же ключом уже был добавлен», когда EF пытался распространить первичный ключ родителя в поле внешнего ключа своего дочернего элемента.

Как только я удалил спецификацию идентификации из таблицы UserAdmins, проблема исчезла.

Проблема решена.

2 голосов
/ 29 августа 2010

Да, именно в этом проблема.Как вы получили членство в MemberUser?Если вы не получили его из текущего ObjectContext, EF считает, что он новый, и пытается вставить его в таблицу aspnet_users.

Попробуйте использовать этот код после добавления пользователя в ObjectSet:

// db is ObjectContext instance
db.ObjectStateManager.ChangeObjectState(membershipUser, EntityState.Unchanged);

Возможно, есть и другие способы достижения того же результата, но это работает для меня.

...