无法插入重复键

时间:2009-10-31 22:37:55

标签: asp.net-mvc linq-to-sql

我收到此错误...

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

当我尝试在ASP.NET MVC中使用成员资格和角色提供程序时。从RoleProvider内部调用GetUser方法时会发生这种情况。

        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 个答案:

答案 0 :(得分:1)

问题出现在代码中

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

根据sql返回的错误消息,GetUser之类的Read操作不会抛出此类错误。

答案 1 :(得分:0)

我怀疑是因为你要添加一个已存在的组。

在尝试添加角色之前,您可能需要检查角色是否存在。

希望这有帮助。

答案 2 :(得分:0)

调试此方法的一个好方法是使用SQL事件探查器来确定对数据库运行的SQL代码。

我怀疑您正在尝试将记录保存在数据库中已存在相同主键的位置。

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

答案 3 :(得分:0)

您确定没有尝试在已存在的PRIMARY KEY字段中输入数字吗?如果是auto_increment,只需输入0,它将生成该字段的值,最后一个数字+ 1

希望这会有所帮助:)

答案 4 :(得分:0)

如果异常是SqlException,您可能会获得重复记录的错误号,即2627.您可能会捕获异常并进行验证,并相应地显示和管理任何错误。我希望这有帮助。

 catch (SqlException ex)
            {
                if (ex.Number == 2627)
                {
                    MessageBox.Show("This record exists: "+ex.Message, "Error");
                }
                else
                {
                    MessageBox.Show(ex.Message, "Error")
                }
            }

答案 5 :(得分:0)

我是这方面的新手,但我将尝试一下,如果对您不起作用,对不起。

我认为与其使用,

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;
}