繁体   English   中英

无法通过LINQ向SQL Server插入数据

[英]Failed to insert data through LINQ to SQL server

我正在尝试使用LINQ将数据插入数据库。 在我的SQL Server端,我编写了一个序列以生成带有前缀的自定义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插入表'library_db.dbo.Book'的列'BookId'中; 列不允许为空。 INSERT失败。

编辑我的序列和表格创建,

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)?

我不确定是否可以使用LINQ-to-SQL进行此操作,但可以尝试一下:

在上下文设计器中,为BookId设置“自动生成的值” = true。 这告诉LINQ-to-SQL将列从插入语句中排除。 现在,数据库将恢复为默认约束,而在插入语句提供值时不会发生这种情况。

但是,可能存在一个问题。 当为主键列定义了自动生成的值时,LINQ-to-SQL随后将尝试通过如下选择语句读取生成的值:

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]

显然,从序列中提取值将使SCOPE_IDENTITY()不确定。 最好的情况是,这将阻止您在SubmitChanges之后从book变量中读取生成的键值,但在最坏的情况下,它将导致SubmitChanges的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM