使用SQL语句向EF db添加数据

使用SQL语句向EF db添加数据,sql,asp.net-mvc,database,entity-framework,Sql,Asp.net Mvc,Database,Entity Framework,控制器: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Register(User user) { if (ModelState.IsValid) { string sqlQuery = "INSERT INTO dbo.Users VALUES (" + user.ToString() + ")"; db.Database

控制器:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Register(User user)
    {
        if (ModelState.IsValid)
        {
            string sqlQuery = "INSERT INTO dbo.Users VALUES (" + user.ToString() + ")";
            db.Database.SqlQuery<User>(sqlQuery);
            db.SaveChanges();

            Session["User"] = user.UserName;
            Session["Pass"] = user.Password;
            Session["RoleID"] = user.RoleID;

            return RedirectToAction("Index", "Shop");
        }

        return View(user);
    }

已解决

我已经使用SQLServerExpress重新创建了数据库,并确保ID字段将自动递增。
使用ADO.NET实体数据库重新生成数据库。。。在代码中更改了名称,现在一切正常

似乎UserID是自动递增属性,所以从toString()方法中删除这个.UserID。而且,由于不需要UserID,因此如果控制器的(!db.Users.Any())user.UserID=0,则删除此

实际上,SqlQuery方法用于Select查询,而ExecuteSqlCommnad方法用于插入更新删除命令

因此,将SqlQuery替换为ExecuteSqlCommnad,它将向表中插入数据

更新

我在您添加问题时创建表,并在控制器中添加以下代码。它将数据插入到表中,没有任何问题

控制器

var user = "'" + "Admin" + 
           "', '" + "123456" + 
           "', '" + "Local Host" +
           "', '" + "admin@admin.com" +
           "', '" + "Local, Host st" +
           "', '" + "1" + "'";

var query = "INSERT INTO Users VALUES (" + user + ")";

var context = new YourDbContext();
context.Database.ExecuteSqlCommand(query);
context.SaveChanges();

在执行
Database.SqlQuery(SqlQuery)之前,您可能希望在代码中放置一个断点语句并检查是否有正确的SQL insert语句。当断点到达时,复制
sqlQuery
varaiable的值(其中包含insert语句),并尝试直接在SSMS查询窗口上执行该值。如果成功插入一条记录,则表示您的查询没有问题

我可以看出你的问题。
RoleID
列的类型为int,但在
toString()
实现中,在处理字符串字段时将其包装在单引号内

+ "','" + this.RoleID + "'"
如上所述,捕获sqlQuery变量的值,它将告诉您哪里出了问题

编辑:根据OP的评论

您的用户表有一个UserID列,我在Insert语句中没有看到。如果该列设置为获取除UserID列以外的自动增量/标识值,则只有6列。但是Insert语句有7个值

你应该试试下面这个。这里我指定要插入的列。您可以注意到,我传递的列数和值数是匹配的

INSERT INTO dbo.Users (UserName,Password,Name,Email,Address,RoleID) 
 VALUES 
('someUserName','pass','Scott','localhost@local.com','My addrss',0)
另外,请确保如果
RoleId
具有角色表的forigen键,则应传递有效的
RoleId
,而不是0


仔细评估sql语句,确保为字符串值打开的每个单引号都有正确的单引号结束。

发布代码,而不是代码的图片。数据仍然没有插入到表中,在替换它之后,我得到一个错误,说我试图插入的列数与表不匹配(可能是因为
用户ID
),所以我添加了
用户ID
,之后我一直得到这个错误:
System.Data.SqlClient.SqlException:字符串或二进制数据将被截断。
。据我所见,我试图插入的数据与列的类型不匹配或不够长,因此我将所有内容更改为
Text
,而不是
nchar(10)
,但仍然没有success@kingston951,你能给我看看桌子的结构吗?[拍摄数据类型的表格结构截图,将其上传到任意位置并将URL粘贴到此处]我更新了question@kingston951,根据您的表结构,从insert查询中删除UserID并使用EXECUTESQLCOMNAD,如果仍然没有帮助,则将数据类型文本更改为varchar(MAX)。这是我得到的语句,它实际上不能作为查询
插入到dbo中。用户值('Testing123','123456','LocalHost','localhost@local.com“,”Local,Host st',0)
我不明白这句话有什么不对。我试过你写的那句话,发现我真的没有RoleID-0,所以我把它改成了5(客户)然后我得到了这个错误,就像我在第二个答案中写的:
msg8152,16级,状态4,第1行字符串或二进制数据将被截断。语句已终止。
+ "','" + this.RoleID + "'"
INSERT INTO dbo.Users (UserName,Password,Name,Email,Address,RoleID) 
 VALUES 
('someUserName','pass','Scott','localhost@local.com','My addrss',0)