Entity Framework Code First - Невозможно вставить повторяющийся ключ в объект 'db' - PullRequest
1 голос
/ 27 марта 2011

Сначала я использую новый код EF для одного моего проекта, и я получаю странную ошибку, мой режим:

abstract class Member
{
   public virtual int MemberId;
  ... some other stuff

}

class User : Member
{
    public virtual string Name;
    ... some more props no new key defined
}

class MyDbContext
{
    public DbSet<User> Users {get;set;}
}

Результат развертывания на SQL Server просто в порядке, у меня есть таблица членов и таблица пользователей (TPC). Теперь у меня в основном есть следующий код:

static Main()
{
   User x,y;
   using(MyDbContext ctx = new MyDbContext())
   {


    x = ctx.Users.Create();
    y = ctx.Users.Create();
    x.Name = "SomeUser";
    y.Name = "SomeUser2";
    ctx.SaveChanges();

   }
}

При сохранении изменений я получаю:

"Необработанное исключение: System.Data.Entity.Infrastructure.DbUpdateException: Произошла ошибка при обновлении записей. Смотрите внутреннее исключение для подробности. ---> System.Data.UpdateException: ошибка произошло при обновлении записей. Смотрите внутреннее исключение для деталей. ---> System.Data.SqlClient .SqlException: нарушение ПЕРВИЧНОГО КЛЮЧЕВОЕ ограничение 'PK_ Пользователи _0CF04B1821B6055D. Не могу вставить дубликат ключа в объект 'dbo.Users'. "

MemberId по умолчанию является личностью, поэтому я просто не вижу, что здесь происходит. Я пытался создать экземпляры с новыми и прикрепить их к контексту, но ошибка была та же, какие-нибудь идеи? База данных пуста!

Спасибо.

РЕДАКТИРОВАТЬ: Забыл сказать, что Member является абстрактным классом, извините за это.

Ответы [ 4 ]

3 голосов
/ 27 марта 2011

Я только что проверил это и таблицы производных типов в TPC (таблица для конкретного типа) Наследование не определило PK в качестве идентификатора в EF 4.1 RC.

1 голос
/ 17 апреля 2014

Я только что столкнулся с этим. Как и отмеченные состояния ответа, TPC не устанавливает ключ для идентификации. Таким образом, вы можете использовать для этого аннотацию:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
1 голос
/ 27 марта 2011
  1. Является ли MemberId автоинкремментированным?
  2. Вы проверили идентификатор созданных вами пользователей (например, с console.Writeline)?
  3. Работает ли это, если вы делаете следующее:

    x = ctx.Users.Create();        
    x.Name = "SomeUser";        
    ctx.SaveChanges();        
    y = ctx.Users.Create();        
    y.Name = "SomeUser2";        
    ctx.SaveChanges();
    

Вы должны попытаться присоединить свою сущность, прежде чем изменить ее.

0 голосов
/ 20 января 2016
  • У меня также была проблема с дублирующимися ключами.Для меня причина была в том, что я по ошибке использовал

    Id = новый Guid ()

вместо

Id = Guid.NewGuid()

в заводском методе инициализациимоя база данных

...