linq和自动增量

时间:2016-08-15 14:02:04

标签: c# sql-server linq

错误:

  

类型' System.Data.SqlClient.SqlException'未处理的异常   发生在System.Data.Linq.dll中        附加信息:违反PRIMARY KEY约束' PK_users'。无法在对象' dbo.users'中插入重复的密钥。该   重复键值为(0)。        声明已经终止。

代码:

private void register_Click(object sender, RoutedEventArgs e)
{
    var _user = new user();
    if (username.Text.Length == 0)
    {
        username.Text = "Geef gebruikersnaam in";
    }
    else if (password.Text.Length == 0)
    {
        password.Text = "Voer wachtwoord in";
    }
    else if (password.Text != passcon.Text)
    {
        password.Text = "Wachtwoorden niet gelijk";
    }
    else
    {
        using (MD5 md5Hash = MD5.Create())
        {
            _user.password = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(password.Text));
        }
        _user.username = username.Text;

        bool contactExists = _dataDC.users.Any(x => x.username.Equals(_user.username));
        if (contactExists)
        {
            MessageBox.Show("Gebruiker bestaat al");
        }
        else
        {
            _dataDC.users.InsertOnSubmit(_user);
            _dataDC.SubmitChanges();

            MessageBox.Show("Registratie succesvol");
            MainWindow _main = new MainWindow();
            _main.Show();
            this.Close();
        }
    }
}

我正在使用SQL Server Manager。我表中的主键是“ID'”。启用自动增量。我没有在任何地方设置ID,所以它技术上是null,但我得到了这个错误。任何解决方案?

编辑:modelclass:

public user user
        {
            get
            {
                return this._user.Entity;
            }
            set
            {
                user previousValue = this._user.Entity;
                if (((previousValue != value) 
                            || (this._user.HasLoadedOrAssignedValue == false)))
                {
                    this.SendPropertyChanging();
                    if ((previousValue != null))
                    {
                        this._user.Entity = null;
                        previousValue.recipients.Remove(this);
                    }
                    this._user.Entity = value;
                    if ((value != null))
                    {
                        value.recipients.Add(this);
                        this._recipient1 = value.username;
                    }
                    else
                    {
                        this._recipient1 = default(string);
                    }
                    this.SendPropertyChanged("user");
                }
            }
        }

Propertychanged:

public partial class user : INotifyPropertyChanging, INotifyPropertyChanged
    {

        private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

        private int _userid;

        private string _username;

        private System.Data.Linq.Binary _password;

        private EntitySet<email> _emails;

        private EntitySet<recipient> _recipients;

    #region Extensibility Method Definitions
    partial void OnLoaded();
    partial void OnValidate(System.Data.Linq.ChangeAction action);
    partial void OnCreated();
    partial void OnuseridChanging(int value);
    partial void OnuseridChanged();
    partial void OnusernameChanging(string value);
    partial void OnusernameChanged();
    partial void OnpasswordChanging(System.Data.Linq.Binary value);
    partial void OnpasswordChanged();
    #endregion

        public user()
        {
            this._emails = new EntitySet<email>(new Action<email>(this.attach_emails), new Action<email>(this.detach_emails));
            this._recipients = new EntitySet<recipient>(new Action<recipient>(this.attach_recipients), new Action<recipient>(this.detach_recipients));
            OnCreated();
        }

        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_userid", DbType="Int NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
        public int userid
        {
            get
            {
                return this._userid;
            }
            set
            {
                if ((this._userid != value))
                {
                    this.OnuseridChanging(value);
                    this.SendPropertyChanging();
                    this._userid = value;
                    this.SendPropertyChanged("userid");
                    this.OnuseridChanged();
                }
            }
        }

        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_username", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
        public string username
        {
            get
            {
                return this._username;
            }
            set
            {
                if ((this._username != value))
                {
                    this.OnusernameChanging(value);
                    this.SendPropertyChanging();
                    this._username = value;
                    this.SendPropertyChanged("username");
                    this.OnusernameChanged();
                }
            }
        }

        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_password", DbType="VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
        public System.Data.Linq.Binary password
        {
            get
            {
                return this._password;
            }
            set
            {
                if ((this._password != value))
                {
                    this.OnpasswordChanging(value);
                    this.SendPropertyChanging();
                    this._password = value;
                    this.SendPropertyChanged("password");
                    this.OnpasswordChanged();
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

您需要将id属性标记为自动生成。根据您使用的技术,可以在设计器中对其进行修改,向属性添加[Key]属性,或使用流畅配置将其配置为密钥。

在LINQ to SQL设计器中,您将AutoGenerated属性设置为true并将自动同步设置为OnInsert - auto generate in LINQ to SQL