我在SQL Server Management Studio中创建了一个包含两列的表,FacilityId
是主键,而不是null。设计完成后,我手动添加了第一行。
但是,当我以编程方式在C#代码中将新记录插入表中时,我收到此错误:
无法将值NULL插入“FacilityId”列,表'xxxxxxxx';列不允许空值。
我的代码表:
public class MyURL
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("FacilityId")]
public int FacilityId { get; set; }
[Column("Url")]
public string Url { get; set; }
}
通过以下代码添加新记录:
public void AddNewUrl(int id, string url)
{
using (MyUrlContext context = new MyUrlContext())
{
context.Database.Connection.ConnectionString = GetConnectionString(context);
var data = GetNewUrl(id, url);
SaveContextAfterAddingNewRecord(context, data);
}
}
public virtual void SaveContextAfterAddingNewRecord(MyUrlContext context, MyURL data)
{
context.MyEndpoints.Add(data);
context.SaveChanges();
}
并且
public class MyUrlContext : DbContext
{
public MyUrlContext():base()
{
Database.SetInitializer<MyUrlContext>(null);
}
public DbSet<MyURL> MyEndpoints { get; set; }
}
那有什么不对?
修改
db / table结构。
另外,我确实有提供的价值。
见图片:
我确信身份属性已关闭。
EDIT2:
SS分析器指示
exec sp_executesql N'INSERT [dbo].[TableName]([Url])
VALUES (@0)
SELECT [FacilityID]
FROM [dbo].[TableName]
WHERE @@ROWCOUNT > 0 AND [FacilityID] = scope_identity()',N'@0 nvarchar(max) ',@0=N'sdfsdf'
答案 0 :(得分:0)
数据库表中FacilityID
的确切定义是什么?
是否将其定义为 IDENTITY
列(以使SQL Server自动分配值)?
如果是这样,那么您需要在EF模型中使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。
如果 未定义为标识列,则在插入新行时必须提供值。
更新:如果该列不是标识列(似乎就是这种情况),我建议您完全删除{{1}您的模型类的属性:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
答案 1 :(得分:0)
最后在团队成员的帮助下重新获得它。代码本身没有错。问题是我将项目开发为类库并将其添加到asp.net MVC应用程序中。 Web应用程序是DNX 4.5.1项目。因为我的原始dll有一些缺陷我相信,虽然我更新了它,DNX 4.5.1框架无法找到它。它总是看起来是缓存中的原始dll。
正确的操作是将dll推送到Nuget服务器,然后添加到Web应用程序。所以dll版本可以自动递增。
所以无论我播放什么属性,它都无法正常工作。希望在Visual Studio 2015发行版的下一个版本中,可以重新解决该问题。