[英]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.