我正在使用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。
答案 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; }
}