无法通过LINQ到SQL服务器插入数据

时间:2017-04-12 20:35:25

标签: c# sql-server linq

我正在尝试使用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)中?

1 个答案:

答案 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变量中读取生成的键值,但在最坏的情况下,它会导致您无法解决的错误。