在非标识主键中插入值

时间:2015-12-04 10:41:01

标签: c# entity-framework

我正在使用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不能为空:

  

您无法在“PRODUCT_ID”列“产品”中插入值NULL   表。该列不允许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 个答案:

答案 0 :(得分:1)

考虑,不要使用直的整数ID字段,而是将其设为自动编号(IDENTITY)列。如果你使它成为IDENTITY,你可以保留product.Id = 0并且EF会自动生成它。调用I am inside main method I am inside method 1 后,如果需要创建对象的ID,则会为您设置product.PRODUCT_ID。

答案 1 :(得分:0)

我真的无法看到ID如何为null,因为它被声明为int而不是int?。如果有一个对象实例,则必须有一个值 - 如果对象的初始化出现问题,则可能是0

模型构建代码看起来是正确的,但是在引用添加项目的代码中有一个怪癖。我期待像

这样的东西
dbContext.Products.Add(dataProduct);

使用名为Products的DbSet,而不是

dbContext.Add(dataProduct);

我不知道这会产生什么影响,但有兴趣知道这只是一个错字,还是问题的一部分。

如果你直接将条目添加到上下文中,它会起作用吗?

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

答案 2 :(得分: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; }
}