Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将值NULL插入列';维护ID';,表'&书信电报;表名>';;列不允许空值。插入EF 6.1_C#_Sql Server_Entity Framework_Azure - Fatal编程技术网

C# 无法将值NULL插入列';维护ID';,表'&书信电报;表名>';;列不允许空值。插入EF 6.1

C# 无法将值NULL插入列';维护ID';,表'&书信电报;表名>';;列不允许空值。插入EF 6.1,c#,sql-server,entity-framework,azure,C#,Sql Server,Entity Framework,Azure,因此,我尝试在azure上向我的db添加一个条目,但由于某些原因,db没有为该条目生成我的PK。 下面是用于创建数据库和执行输入的所有代码。 这是EF 6.1上的控制台应用程序 上下文 public BlizzardDbContext() : base("AzureSqlDb") { } public DbSet<Maintenance> Maintenances { get; set; } 在保存更改时失败的测试 var context = new Bliz

因此,我尝试在azure上向我的db添加一个条目,但由于某些原因,db没有为该条目生成我的PK。
下面是用于创建数据库和执行输入的所有代码。
这是EF 6.1上的控制台应用程序

上下文

public BlizzardDbContext() : base("AzureSqlDb")
{
}

public DbSet<Maintenance> Maintenances { get; set; }
在保存更改时失败的测试

var context = new BlizzardDbContext();
context.Maintenances.Add(new Maintenance() {Start = DateTime.Now, End = DateTime.Now, Info = ""});
context.SaveChanges();
我知道这听起来很简单,我以前用过几次EF,但这次不知道出了什么问题 这里是错误

无法将值NULL插入到表“.dbo.Maintenances”的列“MaintenanceId”中;列不允许为NULL。insert失败。\r\n语句已终止


更新:通过删除数据库并重新创建来解决此问题,我认为EF出现了一些奇怪的情况,它没有正确地使用迁移更新数据库,因为在重新创建后,列被设置为Identity,登录到数据库并验证MaintenanceId是否确实自动生成密钥,我怀疑在迁移过程中,或者在构建表的过程中,发生了一些有趣的事情


另外,确保没有禁用DbContext类中的对象跟踪。它是默认启用的,因此除非您显式禁用它,否则您不必担心它:)

只需验证MaintenanceId是否为数据库中的标识键即可。 如果不是,或者您不确定是否可以尝试下面的选项

改变

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]


.None-这意味着“数据库不生成值。”

错误消息几乎完全说明了问题所在。要么您没有传递值,因为您告诉EF数据库应该提供它,要么您传递值,因为该列不是标识列。在本例中,该列不是标识列(或已关闭)。@ErikPhilips是的,我理解,但正如您从我的模型中看到的,数据注释(我也尝试使用fluent API)告诉db它是PK collum。这是在SQL Server对象资源管理器
ALTER TABLE[dbo].[Maintenances]ADD CONSTRAINT[PK_dbo.Maintenances]主键集群([MaintenanceId]ASC)中访问列时生成的SQL这是一个SQL Server错误。SQL Server告诉您,无论您如何配置EF,它都不是标识列。据我所知,我无法登录数据库,因为它是Azure云数据库,但我可以通过VS的SQL对象浏览器访问它,该浏览器确认它是(PK,int,not null)使用在上面的注释中创建它的代码,您可以登录到云数据库,只要您有权访问azure门户,如果您愿意,您可以使用SQL Server Management studio。只需指向服务器的url,并使用用户名/密码。也许您应该尝试删除密钥(DatabaseGenerated)上的第二个属性,看看这是否有帮助?我自己从来没有用过,现在仍然得到了加法。好吧,我以前的错误是,我想设置
DatabaseGeneratedOption。None
修复了它,但我忘记了
int
的默认值是0,它可以插入数据库,所以它不是。所以在做了你所说的之后,我检查了数据库,发现col并不是一个身份col,它是PK而不是身份,你知道如何解决这个问题吗?优先选择代码如果您将MaintenanceId标记为Key,那么这就足以让迁移发挥神奇的作用。如果您想在数据库中快速修复它,您可以在SQL对象资源管理器中编辑该表。好的,这次我得到了它,我认为EF发生了一些奇怪的事情,以至于它没有正确地应用迁移。所以我删除了数据库并用相同的代码重新创建了它,它实际上是和标识col now哦,哇,好吧,所以将它设置为None使它工作,我很困惑,如果我不包括它,我会得到错误,但当我设为null时它工作吗?和PK一样的MaintenanceId仍然可以在这里找到答案:)我需要用另一种方式来做,因为我的PK不是自动生成的。当传入填充了密钥的实体模型时,错误消息是属性为NULL。。当它不为空时。因此,我不得不使用
[DatabaseGenerated(DatabaseGeneratedOption.None)]
并且它工作了。
 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]