【发布时间】:2011-02-21 22:13:11
【问题描述】:
我正在尝试通过 LINK to SQL 在我的数据库中插入一个用户,但我遇到了一个异常:
无法将值 NULL 插入 列“用户 ID”,表 'mydatabase.developer.Users';柱子 不允许空值。插入失败。 声明已终止。
我已将 UserID 标记为我的 Users 表中的主键,并且我希望当我尝试在表中插入新用户时 SQL Server 会自动生成一个 PK。
我几乎复制并粘贴了来自Pro ASP.NET MVC Framework 第 4 章“设置 LINQ to SQL”部分的示例。一切都井井有条...我的数据库有一个带有 UserID (PK) 列和 Name 列(均不可为空)的 Users 表,下面是与数据库表对应的类:
public class User
{
[DisplayName("User ID")]
[Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
internal int UserID { get; set; }
[DisplayName("Name")]
[Column]
public string Name{ get; set; }
}
我还有一个允许我修改数据库的存储库类:
public class UsersRepository : IUsersRepository
{
private DataContext database;
private Table<User> usersTable;
public UsersRepository(string connectionString)
{
database = new DataContext(connectionString);
usersTable = database.GetTable<User>();
}
public void AddUser(User user)
{
usersTable.InsertOnSubmit(user);
try
{
database.SubmitChanges();
}
catch (Exception e)
{
var msg = e.Message;
}
}
//...
}
IUsersRepository ur = new UsersRepository(connectionString);
ur.AddUser(new User{Name = "Joe"});
我也尝试将 UserID 设置为 -1、0 和 1,但我得到了同样的异常!
ur.AddUser(new User{UserID = -1, Name = "Joe"});
ur.AddUser(new User{UserID = 0, Name = "Joe"});
ur.AddUser(new User{UserID = 1, Name = "Joe"});
有人知道这里会发生什么吗?我对此感到非常困惑:什么可能导致 SQL 服务器不生成主键?有什么方法可以检查插入语句并验证实际发送到服务器的内容?
【问题讨论】:
-
我在 winforms 上也发生了同样的事情。没有找到解决方案,最终使用了一直有效的 Context.ExecuteCommand(command1) 的 SQL 字符串
-
@Mathieu 我想通了...自动增量必须设置为 true。看起来很明显,但不那么明显的是what auto-increment is called in SQL Server...原来它被称为“身份”,设置身份会导致自动递增,所以它现在就像一个魅力!
标签: c# sql asp.net-mvc database linq-to-sql