带有 LinqToSql System.Data.Linq.DuplicateKeyException 的 C# 和 SQL Server 数据库出错:无法使用已在使用的键添加实体。

Posted

技术标签:

【中文标题】带有 LinqToSql System.Data.Linq.DuplicateKeyException 的 C# 和 SQL Server 数据库出错:无法使用已在使用的键添加实体。【英文标题】:Error with C# and SQL Server database with LinqToSql System.Data.Linq.DuplicateKeyException: Unable to add an entity with a key already in use.' 【发布时间】:2021-07-03 04:08:01 【问题描述】:

我在 SQL Server 中创建了六个表,分别命名为 stagiaireutilisateur。最初,我将每个表中的主键设置为 ID。运行上面的代码立即返回这个输出:

Create Database gestionStagiaire
use gestionStagiaire

if OBJECT_ID('tempdb..ville') is not null
 drop table ville
create table ville
(
    id_ville int primary key,/*identity(1,1)*/
    nom_ville varchar(50)
)

if OBJECT_ID('tempdb..stagiaire') is not null
 drop table stagiaire
create table stagiaire
(
    id_stagiaire int primary key identity(1,1),
    nom_stagiaire varchar(50),
    dateNaiss_stagiaire date,
    cin_stagiaire varchar(10),
    telephone_stagiaire varchar(15),
    email_stagiaire varchar(50),
    adresse_stagiaire varchar(100),
    id_ville int foreign key references ville(id_ville)
)



if OBJECT_ID('tempdb..ecole') is not null
 drop table ecole
create table ecole
(
    id_ecole int primary key identity(1,1),
    nom_ecole varchar(50),
    id_ville int foreign key references ville(id_ville)
)

if OBJECT_ID('tempdb..encadrant') is not null
 drop table encadrant
create table encadrant
(
    id_encadrant int primary key identity(1,1),
    nom_encadrant varchar(50)
)

if OBJECT_ID('tempdb..stage') is not null
 drop table stage
create table stage
(
    id_stage int primary key identity(1,1),
    sujet_stage varchar(100),
    dateDebut_stage date,
    dateFin_stage date,
    id_ecole int foreign key references ecole(id_ecole),
    id_stagiaire int foreign key references stagiaire(id_stagiaire),
    id_encadrant int foreign key references encadrant(id_encadrant)
)

if OBJECT_ID('tempdb..utilisateur') is not null
 drop table utilisateur
create table utilisateur
 (
    login_utilisateur varchar(50) primary key,
    nom_utilisateur varchar(50),
    pass_utilisateur varchar(50)
 )
 

C#代码:

private void Button_AStagiaireDgv_Click(object sender, EventArgs e)

        
        //DataClasses1DataContext dc = new DataClasses1DataContext(con);
        //stagiaire newStagiaire = new stagiaire();
        //newStagiaire.id_stagiaire=""
        stagiaire sr = new stagiaire();
        //sr.id_stagiaire = Convert.ToInt32(TextBox_IdStagiaire.Text);
        sr.nom_stagiaire = TextBox_NomStagiaire.Text;
        sr.dateNaiss_stagiaire = DateTime.Parse(DateTimePickerStagiaire.Text);
        sr.ci_stagiaire = TextBox_CinStagiaire.Text;
        sr.telephone_stagiaire = TextBox_TeleStagiaire.Text;
        sr.email_stagiaire = TextBox_EmailStagiaire.Text;
        sr.adresse_stagiaire = TextBox_AdresseStagiaire.Text;
        //sr.id_ville = int.Parse(TextBox_IdVilleStagiaire.Text);
        sr.id_ville = int.Parse(ComboBox_IdVilleStagiaire.Text);//.SelectedValue.ToString()
        dc.stagiaire.InsertOnSubmit(sr);
        dc.SubmitChanges();
        charge_load();
        

        /*
        //int idstagiaire = int.Parse(TextBox_IdStagiaire.Text);
        string nomstagiaire = TextBox_NomStagiaire.Text;
        DateTime datenaiss = DateTime.Parse(DateTimePickerStagiaire.Text);
        string cinstagiaire = TextBox_CinStagiaire.Text;
        string telstagiaire = TextBox_TeleStagiaire.Text;
        string mailstagiaire = TextBox_EmailStagiaire.Text;
        string adressestagiaire = TextBox_AdresseStagiaire.Text;
        int idville = int.Parse(ComboBox_IdVilleStagiaire.Text);

        var st = new stagiaire
        
            //id_stagiaire = idstagiaire,
            nom_stagiaire = nomstagiaire,
            dateNaiss_stagiaire = datenaiss,
            ci_stagiaire = cinstagiaire,
            telephone_stagiaire = telstagiaire,
            email_stagiaire = mailstagiaire,
            adresse_stagiaire = adressestagiaire,
            id_ville = idville
        ;
        dc.stagiaire.InsertOnSubmit(st);
        dc.SubmitChanges();
        MessageBox.Show("Ajoute avec succes");
        charge_load();
        */
    

【问题讨论】:

“运行上面的代码立即返回了这个输出” 什么代码?什么输出?你有什么问题? 为什么,在您的 SQL 中,您要检查 tempdb 中是否存在对象,然后在您刚刚创建的数据库 (gestionStagiaire) 中创建对象?当它不会阻止以下语句失败时,检查对象是否存在有什么意义;不像你刚刚创建的数据库那样。 【参考方案1】:
Create Database gestionStagiaire
use gestionStagiaire

if OBJECT_ID('tempdb..ville') is not null
 drop table ville
create table ville
(
    id_ville int primary key,/*identity(1,1)*/
    nom_ville varchar(50)
)

if OBJECT_ID('tempdb..stagiaire') is not null
 drop table stagiaire
create table stagiaire
(
    id_stagiaire int primary key identity(1,1),
    nom_stagiaire varchar(50),
    dateNaiss_stagiaire date,
    cin_stagiaire varchar(10),
    telephone_stagiaire varchar(15),
    email_stagiaire varchar(50),
    adresse_stagiaire varchar(100),
    id_ville int foreign key references ville(id_ville)
)



if OBJECT_ID('tempdb..ecole') is not null
 drop table ecole
create table ecole
(
    id_ecole int primary key identity(1,1),
    nom_ecole varchar(50),
    id_ville int foreign key references ville(id_ville)
)

if OBJECT_ID('tempdb..encadrant') is not null
 drop table encadrant
create table encadrant
(
    id_encadrant int primary key identity(1,1),
    nom_encadrant varchar(50)
)

if OBJECT_ID('tempdb..stage') is not null
 drop table stage
create table stage
(
    id_stage int primary key identity(1,1),
    sujet_stage varchar(100),
    dateDebut_stage date,
    dateFin_stage date,
    id_ecole int foreign key references ecole(id_ecole),
    id_stagiaire int foreign key references stagiaire(id_stagiaire),
    id_encadrant int foreign key references encadrant(id_encadrant)
)

if OBJECT_ID('tempdb..utilisateur') is not null
 drop table utilisateur
create table utilisateur
 (
    login_utilisateur varchar(50) primary key,
    nom_utilisateur varchar(50),
    pass_utilisateur varchar(50)
 )
 

【讨论】:

欢迎使用 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码编辑器工具栏上的示例”按钮 ( ) 以很好地格式化和语法突出显示它!

以上是关于带有 LinqToSql System.Data.Linq.DuplicateKeyException 的 C# 和 SQL Server 数据库出错:无法使用已在使用的键添加实体。的主要内容,如果未能解决你的问题,请参考以下文章

C#→关于System.Data.Linq下的Table<TEntity> 泛型类 的问题

C# ASP.NET ASP.NET#命名空间"System.Data"中不存在类型或命名空间名称"Linq"(是否缺少程序集引用?)

如何在带有 LINQ to SQL 的存储过程中使用临时表

使用带有 Linq to Sql 的 Sql Server 唯一标识符/更新日期列 - 最佳方法

带有更新查询的 OleDbCommand 导致 OleDbException

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。