带有 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 中创建了六个表,分别命名为 stagiaire
和 utilisateur
。最初,我将每个表中的主键设置为 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 的 Sql Server 唯一标识符/更新日期列 - 最佳方法