向数据库中添加int值时出错,但字符串值有效
本文关键字:字符串 有效 出错 添加 int 数据库 | 更新日期: 2023-09-27 17:57:49
我目前正在一个MVC项目中进行开发,使用实体框架和SQL Express服务器。
我正在尝试将用户添加到"用户"表中。用户当前受到以下危害:
CREATE TABLE [dbo].[Users] (
[UserID] INT NOT NULL PRIMARY KEY,
[Admin] BIT NOT NULL,
);
当我通过下面的功能添加到上表中时:
[HttpPost]
public String AddUser(List<String> values)
{
using (DataBASE db = new DataBASE())
{
Users newUser = new Users();
newUser.UserID = Int32.Parse(values[0]); //There is correct data stored here as an int value
newUser.Admin = Boolean.Parse(values[1]); //There is correct data stored here as an bool value
db.Users.Add(newUser); //The newUser object is correct
db.SaveChanges(); //The error occurs here
}
return "success";
}
EDIT,这是请求的Users类(无论何时存储到数据库中,都会更改为字符串):
[Table("Users")]
public class Users
{
[Key]
public int UserID { get; set;}
public bool Admin { get; set; }
}
我收到以下错误:
"Cannot insert the value NULL into column UserID, table ‘…''DATABASE.MDF.dbo.Users';
column does not allow nulls. INSERT fails.'r'nThe statement has been terminated."}
该值不为NULL,并且数据库连接正确(因为删除功能工作正常,当我进入该功能时,数据库连接正确,并且该功能在添加新用户更新之前提供了正确的数据。
当我将数据库更改为以下内容时:
CREATE TABLE [dbo].[Users] (
[UserID] NVARCHAR(50) NOT NULL PRIMARY KEY,
[Admin] BIT NOT NULL,
);
我使用以下函数添加了一个用户(将上面的函数更改为不传递int,而是保留字符串值):
[HttpPost]
public String AddUser(List<String> values)
{
using (DataBASE db = new DataBASE())
{
Users newUser = new Users();
newUser.UserID = values[0]; //There is correct data stored here as an string value
newUser.Admin = Boolean.Parse(values[1]); //There is correct data stored here as an bool value
db.Users.Add(newUser); //The newUser object is correct
db.SaveChanges(); //NO error occurs here
}
return "success";
}
这是将Users类更改为字符串以用于字符串解决方案:
[Table("Users")]
public class Users
{
[Key]
public string UserID { get; set;}
public bool Admin { get; set; }
}
在我不知道的数据库中是否存在反对使用INT值的内容?
您应该添加属性
[DatabaseGenerated(DatabaseGeneratedOption.None)]
到您的UserId
属性。它说EF应该从属性中获取值,而不是默认在数据库级别。
Users newUser = new Users();
newUser.UserID = Int32.Parse(values[0]); //There is correct data stored here as an int value
newUser.Admin = Boolean.Parse(values[1]); //There is correct data stored here as an bool value
db.Users.Attach(newUser);
db.Users.Add(newUser); //The newUser object is correct
db.SaveChanges();
最后一次尝试,我不确定,只是想到
如果数据库中已经存在相同的id,则可能会出现问题
老实说,这不是什么答案。但是,我能做的最好的事情来解决我的问题,那就是编写一个原始查询并在下面执行它,它可以在数据库和整个应用程序中使用int值。我仍然不知道,也可能永远不会知道,为什么上面的函数不适用于int值。
using (DataBASE db = new DataBASE())
{
try
{
db.Database.ExecuteSqlCommand("INSERT INTO Users VALUES({0},{1})", Int32.Parse(values[0]), Boolean.Parse(values[1]));
db.SaveChanges();
}
catch (Exception e)
{
var exception = e;
}
}
您可以尝试将UserID列重命名为Id或UsersId,删除[Key]表示法,遵循EF约定,但仅用于测试。