Невозможно вставить дубликат ключа - PullRequest
0 голосов
/ 01 ноября 2009

Я получаю эту ошибку ...

Violation of PRIMARY KEY constraint 'PK_Members'. Cannot insert duplicate key in object 'dbo.Members'.
The statement has been terminated.

Когда я пытаюсь использовать поставщиков членства и ролей в ASP.NET MVC. Это происходит при вызове метода GetUser из RoleProvider.

        var member = System.Web.Security.Membership.GetUser(email) as Models.Member;
        //var member = (
        //    from m in DataContext.Members
        //    where m.Email == email
        //    select m).Single();

        var role = (
            from r in DataContext.Roles
            where r.Name == roleName
            select r).Single();

        member.Groups.Add(new Models.Group(role)); 

        DataContext.SubmitChanges();

Ответы [ 6 ]

1 голос
/ 01 ноября 2009

Похоже, проблема в коде

member.Groups.Add(new Models.Group(role)); 

На основании сообщения об ошибке, возвращаемого sql, операция чтения, такая как GetUser, не будет выдавать этот тип ошибки.

0 голосов
/ 19 марта 2019

Я новичок в этом, но я собираюсь попробовать это, извините, если это не работает для вас.

Я думаю, что вместо использования

member.Groups.Add(new Models.Group(role));

Вы должны использовать следующее (если вы обновляете базу данных):

member.Groups.Entry(new Models.Group(role));

И если приведенный выше код не работает, попробуйте это (если вы добавляете в базу данных):

// First, search for the particular obj you want to insert
var checkModels = member.Groups.Find(new Models.Groups(roles));

// If the obj doesn't already exist, add it to the database
if(checkModels == null){
        member.Groups.Add(new Models.Group(role));
}
// If the obj does exist already, then update it
else{
        member.Groups.Entry(new Models.Group(role)).State = EntityState.Modified;
}
0 голосов
/ 01 ноября 2009

Если исключение является SqlException, вы можете получить его номер ошибки для повторяющихся записей, равный 2627. Вы можете перехватить исключение и проверить его, соответственно отобразить и обработать любую ошибку. Надеюсь, это поможет.

 catch (SqlException ex)
            {
                if (ex.Number == 2627)
                {
                    MessageBox.Show("This record exists: "+ex.Message, "Error");
                }
                else
                {
                    MessageBox.Show(ex.Message, "Error")
                }
            }
0 голосов
/ 01 ноября 2009

Вы уверены, что не пытаетесь ввести число в поле PRIMARY KEY, которое уже там? Если это auto_increment, просто введите 0, и значение этого поля будет равно последнему числу + 1

Надеюсь, это поможет:)

0 голосов
/ 01 ноября 2009

Хороший способ отладки - использование средства профилирования SQL, чтобы определить, какой код SQL запускается для базы данных.

Я подозреваю, что вы пытаетесь сохранить запись где-нибудь с тем же первичным ключом, который уже есть в базе данных.

SQL Profiler = http://msdn.microsoft.com/en-us/library/ms181091.aspx

0 голосов
/ 01 ноября 2009

Я подозреваю, что это потому, что вы добавляете группу, которая уже существует.

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...