我正在尝试使用LINQ将数据插入数据库。在我的SQL服务器端,我编写了一个序列来生成带前缀的自定义ID。这是我在代码中所做的,
ALLibraryDataClassesDataContext dbContext = new ALLibraryDataClassesDataContext();
dbContext.Books.InsertOnSubmit(book);
dbContext.SubmitChanges();
dbContext.Dispose();
在我的book
对象中,我没有设置BookID
,因为它是从序列生成的。我在执行时
INSERT INTO library_db.dbo.Book([BookName]) VALUES ('SH')
这将使用自动生成的ID插入数据。但是当我运行代码时,它会给出一个SQLException,
无法将值NULL插入“BookId”列,表'library_db.dbo.Book';列不允许空值。 INSERT失败。
EDITED 我的序列和表创建,
CREATE TABLE [dbo].[Book] (
[BookId] VARCHAR (50) NOT NULL,
[BookName] VARCHAR (50) NULL,
[AuthorName] VARCHAR (50) NULL,
[PublisherName] VARCHAR (50) NULL,
[PublishedDate] DATE NULL,
[price] MONEY NULL,
[PurchasedDate] DATE NULL,
[PurchasedBillNo] VARCHAR (50) NULL,
[CategoryId] VARCHAR (50) NULL,
[NoOfCopies] VARCHAR (50) NULL,
[FinePerDay] MONEY NULL,
[BookImage] VARCHAR (2000) NULL,
PRIMARY KEY CLUSTERED ([BookId] ASC),
CONSTRAINT [FK_Book_Category] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].
[Category] ([CategoryId])
);
GO
CREATE SEQUENCE dbo.BookId_Seq AS
INT START WITH 1
INCREMENT BY 1 ;
GO
ALTER TABLE dbo.Book
ADD CONSTRAINT Const_BookId_Seq
DEFAULT FORMAT((NEXT VALUE FOR dbo.BookId_Seq),'B0000#') FOR [BookId];
GO
手动运行查询和通过LINQ有什么不同?有没有可能的方法将数据插入到具有自定义ID的代码(LINQ)中?
答案 0 :(得分:1)
我不确定您是否可以使用LINQ-to-SQL执行此操作,但请尝试一下:
在上下文设计器中,设置"自动生成值" = BookId
为真。这告诉LINQ-to-SQL从insert语句中排除列。现在,数据库将回退到默认约束,当insert语句提供值时,该约束不会发生。
然而,可能存在一个问题。当为主键列定义自动生成的值时,LINQ-to-SQL将尝试通过类似
的select语句读取生成的值。SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
显然,从序列中绘制值将使SCOPE_IDENTITY()
未定义。最好这会阻止您在book
之后从SubmitChanges
变量中读取生成的键值,但在最坏的情况下,它会导致您无法解决的错误。