各位大大,小弟最近在實作Entity Framework insert,model 已經建好了,有在sql server 建好 id auto 產生的function,想讓主鍵的增加都交由server 解決,我碰到的問題是每次在insert時,db.SaveChanges(); 這段程式碼會出錯而原因,就是主鍵不能null,我知道可以連資料庫object ,把後臺server 要做的事情,拉到c#做。
我在server 更新模型中有碰到這個問題"錯誤 6046: 無法產生存放區函式 'id_gennerate' 的函式匯入傳回型別。系統將會忽略存放區函式,而且不會產生函式匯入。",所以只要解決系統無法認清型別的問題,就可以解決主鍵的問題?這是我的猜想....
在可以交由server做的情況下,如何避開主鍵不能null,又能在後台自動增加主鍵,想請各位大大給我點方向。
----------解決方案和問題探討------------------------------------------------
我後來有去國外文章查到造成這個問題的原因,主要是Entity Framework 還不支援sql cerate function,以資料庫更新模型時,他會無法識別sql function,國外文章給的方向是c#撰寫呼叫sql function 類別,以下為出處網址:
https://stackoverflow.com/questions/24161005/error-6046-unable-to-generate-function-import-return-type-of-the-store-function
另一個想法可以把sql server要做的事,拉到c#後端來做,以sql query的方法來取的資料筆數,產生自訂id。
我最後解決的問題方法,我在c#後端這邊給一個default 給id value ,再用sql trigger 在insert之後觸發來更新id value。
可以考慮在SQL-Server建一個Sequence,
然後Insert主鍵直接用Sequence就好~
是不是你的資料庫沒做到自動增加?
我在SQL Server Management Studio 有測試過insert ,function 沒問題........
他在執行到db.SaveChanges(); 就丟出一個exception抱錯,應該是說我的Stored Procedure 的function 輸入type 和return type ,visual studio 好像不認得所以抱錯,"錯誤 6046: 無法產生存放區函式 'id_gennerate' 的函式匯入傳回型別。系統將會忽略存放區函式,而且不會產生函式匯入。"
我sql server 德code:
USE [test_shopping]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].id_gennerate
returns char(50)
as
begin
declare @CustomerId char(50),@CustomerN int = 0
if((select COUNT(*) from Customer)=0)
begin
set @CustomerId = 'Customer' + '1'
end
else
begin
set @CustomerN = (select COUNT(*) from Customer) + 1
set @CustomerId = 'Customer' + CONVERT(char,@CustomerN)
end
return @CustomerId
end