C# System.Data.Entity.Infrastructure.DbUpdateException错误,即使我没有更新id列
我正在从事一个项目,在该项目中,我使用实体框架在sql server 2014上操作数据库。 我的代码如下:C# System.Data.Entity.Infrastructure.DbUpdateException错误,即使我没有更新id列,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我正在从事一个项目,在该项目中,我使用实体框架在sql server 2014上操作数据库。 我的代码如下: private void BtnAddUser(object sender, EventArgs e) { var u = new User(); u.username = txtBoxNewUser.Text; u.password = txtBoxNewPass.Text; u.rank = cmbBoxRank
private void BtnAddUser(object sender, EventArgs e)
{
var u = new User();
u.username = txtBoxNewUser.Text;
u.password = txtBoxNewPass.Text;
u.rank = cmbBoxRank.GetItemText(this.cmbBoxRank.SelectedItem);
using (var db = new ProjetPooEntities2())
{
db.Users.Add(u);
db.SaveChanges();
}
}
请注意,代码运行得很好,但当我按Add按钮将创建的用户添加到db时,在“db.saveChanges()”上会显示一个错误,并显示:
System.Data.Entity.Infrastructure.DbUpdateException:'更新条目时出错。有关详细信息,请参阅内部异常。”
内部的例外是:
SqlException:当identity\u insert设置为OFF时,无法在表“User”中为identity列插入显式值
我已将数据库中的标识列设置为“id”,并将其设置为从1开始自动递增1。
我试过寻找很多解决办法,但什么也没找到。
任何帮助都将不胜感激 试试这个:
设置标识\u在
上插入一些带有标识的表,假设用户
实体具有以下结构:
public class User
{
public int id { get; set; }
public string username { get; set; }
public string password { get; set; }
public string rank { get; set; }
}
如果使用了Code First,则使用选项DatabaseGeneratedOption.Identity添加DatabaseGeneratedAttribute
,将id
设置为Identity autoincrement属性:
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
... // other properties
}
但是,如果先使用数据库,请打开EDMX模型设计器,使用id
字段上的“属性”上下文菜单,并将StoreGeneratedPattern
设置为Identity
:
然后,使用XML编辑器打开EDMX文件,并确保其在id
属性上具有StoreGeneratedPattern=“Identity”
,如下所示:
<EntityType Name="User">
<Key>
<PropertyRef Name="id" />
</Key>
<Property Name="id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
</EntityType>
注意,这种最底层的方法在这里被认为不是一种好的做法,因为在某些情况下允许插入重复的值
相关问题:
您可能需要使用[Key]
和[DatabaseGenerated(DatabaseGeneratedOption.identity)]设置id
为自动增量标识字段的模型
attributes。感谢您的回复,但我对sql server和entity framework不熟悉,不知道在哪里设置这些属性。我是否必须为数据库中的每个表以及类用户开头的这些属性创建一个类?我没有为每个表创建一个类,这就是为什么我要问这个问题。感谢您的帮助您是使用代码优先(基于代码生成DB)还是DB优先(从DB生成模型类)?在给出答案之前,我想先澄清一下,因为他们有不同的方法来设置标识列。使用EF时,这不是一个好的做法,因为它有副作用,允许标识列中出现重复值(阅读详细信息)。@Tetsuya Yamamoto,我删除了该链接,因为它与其他问题相关。RoyNasr说:“我已经将数据库中的标识列设置为“id”,并将其设置为从1开始自动递增1”,因此我认为标识已被取消。非常感谢您,我将“StoreGeneratedPattern”设置为“identity”,它终于起作用了!!!非常感谢你的帮助。
using (var db = new ProjetPooEntities2())
{
// taken from /a/31856991
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] ON");
db.Users.Add(u);
db.SaveChanges();
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] OFF");
}