将int值添加到数据库给出错误,但字符串值有效

时间:2016-07-20 17:35:04

标签: c# .net asp.net-mvc entity-framework sql-server-express

我目前正在开发一个MVC项目,使用Entity框架和SQL Express服务器。

我正在尝试将用户添加到Users表。用户目前受到以下攻击:

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";
}

编辑,这是所请求的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值是否有反对意见?

4 个答案:

答案 0 :(得分:3)

您应该添加属性

[DatabaseGenerated(DatabaseGeneratedOption.None)]

到您的UserId财产。它说EF应该从属性中获取价值,而不是在数据库级别上进行默认。

答案 1 :(得分:0)

 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,则可能有问题

答案 2 :(得分:0)

说实话,这个答案并不多。但是我能够解决我的问题的最好的事情是编写一个原始查询并在下面执行它,它可以在数据库和整个应用程序中使用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;
            }
        }

答案 3 :(得分:0)

您可以尝试将UserID列重命名为Id或UsersId,按照EF约定删除[Key]表示法,但仅用于测试。