在非自增主键中插入值

3

我正在使用SQL SERVER 2012、C#、.NET Framework 4.0和Entity Framework Code First 6.1.3进行工作。

我已经使用SQL生成了这个表:

CREATE TABLE [dbo].[PRODUCTS]
(
    [PRODUCT_ID] INT NOT NULL PRIMARY KEY, 
    [PRODUCT_CODE] NVARCHAR(20) NOT NULL,
    [DESCRIPTION] NVARCHAR(50) NULL, 
    [LAW] TINYINT NOT NULL 
)

要使用EF访问它,我有这个类:

public class PRODUCTS
{
    public int PRODUCT_ID { get; set; }
    public string PRODUCT_CODE { get; set; }
    public string DESCRIPTION { get; set; }
    public byte LAW { get; set; }
}

有了这个配置:

class PRODUCTSConfiguration : EntityTypeConfiguration<PRODUCTS>
{
    public PRODUCTSConfiguration()
    {
        HasKey(p => p.PRODUCT_ID);

        Property(p => p.PRODUCT_CODE)
            .HasMaxLength(20)
            .IsRequired();

        Property(p => p.DESCRIPTION)
            .HasMaxLength(50)
            .IsOptional();

        Property(p => p.LAW)
            .IsRequired();
    }
}

当我尝试使用Entity Framework在此表中插入新行时,dbContext.SaveChanges();出现异常,指出PRODUCT_ID不能为空:

您无法将NULL值插入 'PRODUCTS'表中的“PRODUCT_ID”列。该列不允许NULL值。 INSERT.Se错误结束指令。

要插入新产品,请执行以下操作:
PRODUCTS dataProduct = new PRODUCTS()
{
    PRODUCT_ID = product.Id,
    PRODUCT_CODE = product.ProductCode,
    LAW = product.Law,
    DESCRIPTION = product.Description
};

dbContext.Add(dataProduct);
dbContext.SaveChanges();

但我已经调试过了,PRODUCT_ID有一个值。

我需要做些什么才能在PRODUCT_ID列中插入该值?

顺便说一下,我需要在PRODUCT_ID列中插入一个值,不能使用IDENTITY。

3个回答

1
考虑将整数ID字段替换为自动编号(IDENTITY)列。如果使用IDENTITY,您可以将product.Id = 0,并且EF会自动生成它。在调用dbContext.SaveChanges之后,如果需要创建对象的ID,则product.PRODUCT_ID将已经被设置好了。

抱歉,但这并没有回答我的问题。我想知道为什么如果我已经在 PRODUCT_ID 上设置了一个值,EF 会抛出一个异常,说该列的值为空。 - VansFannel

0

我真的看不到ID为什么会为空,因为它声明为int而不是int?。如果有一个对象实例,那么肯定会有一个值--如果对象初始化出现问题,可能是0

模型构建代码看起来没错,但在你引用添加项目的代码中有一个小问题。我期望看到类似于

dbContext.Products.Add(dataProduct);

使用名为 Products 的 DbSet,而不是
dbContext.Add(dataProduct);

我不明白那会有什么区别,但很想知道这是一个笔误还是问题的一部分。

如果您直接将条目添加到上下文中,是否有效呢?

dbContext.Entry(newStudent).State = System.Data.Entity.EntityState.Added;

0
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Table("TestTable")]
public class TestTable
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int id { get; set; }
    public string descr { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接