56

我正在使用 EF CTP 4。我有一个简单的控制台应用程序(用于测试目的),它使用 EF 将一些数据插入 SQL 数据库。

我遇到了一个问题,在插入项目时

using(var context = GetContext())
{
   BOB b = new BOB();
   b.Id = 1;

   context.Bobs.Add(b);
   context.SaveChanges();
}

它引发错误:{“无法将值 NULL 插入列 'Id',表 'TestDB.dbo.BOB';列不允许空值。INSERT 失败。\r\n语句已终止。”}

该表只有 1 个Id int NOT NULL字段,它是主键,不是自动递增的 Id。

在创建 DataContext 时,我有这个配置,是的,它确实被解雇了。

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<BOB>().HasKey(b => b.Id);
    builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}

我还预先填充了这个表,然后通过调试器能够通过监视加载这个 BOB 对象......所以我真的很难过,至于能够加载我的 BOB 表明一切都很好......但是插入一个新的就崩溃了...

4

10 回答 10

77

我在这里有同样的问题,这真的是一个丑陋的解决方案。

 [Key]
public Int64 PolicyID { get; set; }

这不是一个自动生成的号码

然后我遇到了同样的错误。

EF 代码优先 CTP5

应用后:

 [Key]
 [DatabaseGenerated(DatabaseGeneratedOption.None)]
 public Int64 PolicyID { get; set; }

那么它将起作用。

于 2011-02-24T06:53:39.957 回答
33

我正在使用EF 4.1, Model First并遇到了这个问题。这是我解决它的方法:

使用模型设计器表面时,当您创建实体时,您必须定义一个Key属性,它默认为Id, int32.

在我的情况下,我选择使用GuidsId所以我会切换int32Guid. 但是,如果您在创建实体后检查此 Id,我看到 Id'StoreGeneratedPattern''identity'被选中。起初我不认为这是一个问题,但是当我检查用于插入数据库的 SQL 时,它没有发送我的 ID 有点奇怪。 令人沮丧!

但是一旦我回去将'StoreGeneratedPattern'from更改'identity''none',重新生成数据库并重建项目,这个奇怪的消息就停止了:

无法将值 NULL 插入到列“Id”、表“TestDB.dbo.BOB”中;列不允许空值。插入失败。该语句已终止。

仅供参考 - 在查看更多 sql 时,似乎如果您identity选择了 for StoreGeneratedPattern,则 EF 将对象保存到数据库(无 ID),然后立即取回身份并将其保存回您的对象。即这个选择StoreGeneratedPattern依赖于数据库来生成你的 ID,而不是你的代码!

于 2011-03-17T11:29:16.277 回答
31

您是否尝试过明确指定StoreGeneratedPattern?

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
        .Property(p => p.Id)
            .StoreGeneratedPattern = StoreGeneratedPattern.None;

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
于 2010-12-15T09:48:52.140 回答
6

你也可以使用

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
    .Property(p => p.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
于 2018-09-13T19:37:45.930 回答
3

当我在数据库架构中的受尊重列(身份列)上缺少主键时,它发生在我身上。我在 SQL 服务器之间导出数据,使用 SSMS 导出工具并创建一个新数据库,但没有意识到它只导出数据,没有密钥。

于 2013-05-08T09:19:37.263 回答
1

我有类似的情况,但就我而言,即使设置Identityoff也无济于事。

问题与主键有关,我错过了将其添加到我的实体模型中。

这是生成模型的脚本:

 CREATE TABLE [im].[SomeGroup]
 (
    [Id] INT NOT NULL IDENTITY(1,1), -- this is mandatory for EF
    [OtherGroupId] INT NOT NULL,
    [Title] NVARCHAR(512) NOT NULL
 )

上面的 C# 代码是:

Insert(new SomeGroup
{
  // I'm not providing Id here, cause it will be auto-generated
  SomeGroupId = otherGroup.Id,
  Title = otherGroup.Title
});

这里也有一些解释。

于 2018-04-02T21:45:26.207 回答
0

在我的例子中,EntityFramework 在Context.cs类中生成了这个代码:

modelBuilder.Entity<MODEL_OF_TABLE>(entity =>
{
    entity.Property(e => e.Id).ValueGeneratedNever(); // <= this line must remove
    ...
}

删除此行后,问题解决。

于 2019-10-25T07:39:26.350 回答
0

也遇到了这个问题。对我来说,我的开发数据库表出于某种原因没有带来密钥,因此 EF 没有将我的 ID 定义为密钥。

遇到此问题的任何人请注意:确保您尝试使用 ID 字段向其中插入新记录的表实际上是在 Context 类中定义的。

modelBuilder.Entity<CustomerEmail>(entity =>
        {
            entity.HasKey(e => e.Id)
                .HasName("PK_tblCustomerEmail");

            entity.Property(e => e.Customer).IsUnicode(false);

            entity.Property(e => e.Email).IsUnicode(false);
        });
于 2021-06-18T13:50:03.503 回答
0

如果您使用的是数据库优先方法,那么首先从 edmx 图中删除相应的实体,然后从数据库中更新模型,这肯定会解决您的问题

于 2019-07-21T15:14:00.310 回答
-1

我知道这个问题在某种程度上已经过时了,并且已经找到了一个可接受的解决方案,但是我认为如果我分享我的发现会很有用。

我今天遇到了这个错误,因为我使用了相同的两个不同实例DataContextDataContext我正在创建一个具有一些属性的新模型 - 这些属性的值Add()SaveChanges()使用DataContext. 在我开始使用相同的实例来获取属性的值并实际添加和保存新对象之后 - 一切都开始工作了。

于 2017-11-07T16:44:43.597 回答