iT邦幫忙

0

解決主鍵在Entity Framework insert 時,一定要輸入的問題

  • 分享至 

  • xImage

各位大大,小弟最近在實作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。

優悠 iT邦新手 3 級 ‧ 2019-08-26 09:38:01 檢舉
iXXX_PK integer identity(1,1) unique not null,
我們公司的主鍵,給你參考下,設成這樣insert時,不用給主鍵數值
wolfsky95 iT邦新手 4 級 ‧ 2019-08-26 20:14:30 檢舉
感謝你給的方向,我後來有解決的問題了,我在c#後端這邊給一個default 給id value ,再用sql trigger 在insert之後觸發來更新id value
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
YoChen
iT邦研究生 1 級 ‧ 2019-08-26 12:02:52
最佳解答

可以考慮在SQL-Server建一個Sequence,
然後Insert主鍵直接用Sequence就好~

wolfsky95 iT邦新手 4 級 ‧ 2019-08-26 20:13:33 檢舉

感謝大大讓我學到SQL-Server Sequence的用法,我文中表達不清楚,抱歉,因為是使用資料庫更新mvc model,error 出現的部分是在c#這邊,不是在server 這邊,我後來有解決的問題了,我在c#後端這邊給一個default 給id value ,再用sql trigger 在insert之後觸發來更新id value,感謝大大撥空給我方向

0
小魚
iT邦大師 1 級 ‧ 2019-08-24 19:22:27

是不是你的資料庫沒做到自動增加?

wolfsky95 iT邦新手 4 級 ‧ 2019-08-24 19:33:42 檢舉

我在SQL Server Management Studio 有測試過insert ,function 沒問題........

wolfsky95 iT邦新手 4 級 ‧ 2019-08-24 19:49:22 檢舉

他在執行到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

我要發表回答

立即登入回答