Mysql EF 觸發器生成主鍵id 存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載后可能被修改或刪除。刷新 ObjectStateManager 項 ;System.Data.Entity.Infrastructure.DbUpdateConcurrencyException


http://stackoverflow.com/questions/24725261/how-to-use-a-custom-identity-column-in-sql-with-entity-framework

情景,在mysql的一張表里面的id字段是主鍵,但是這個主鍵的值,不是自增的,也不是用戶傳入的,而是當insert的時候,由觸發器來生成的.

image

這是觸發器代碼

image

我們到edmx模型中看看 EF生成的 , 很詭異的是, 由於我們的 creationtime 的字段是 timestamp 並且有個默認值是 Current_timestamp ,我們的EF居然認為這個是主鍵自增,這里要修改成  none

imageimage

然后我們去看看  userid 是如何設置 默認就是 none

image

下面我們保存一條語句 試試

image

我們通過 Entity Framework Profiler監控可以看到,插入的 主鍵id 是0  ,然后我們去數據庫看看, 觸發器已經是正常工作, 主鍵的id 已經生成了

image

但是這個時候,我們在程序里面,  沒有拿到新生成的主鍵id 啊, 而且剛才的 EF語句里面也沒有幫我們查詢出 新生成的主鍵id 呀… 這個怎么辦?

image

這個時候,我嘗試去修改 edmx 模型,  把 userid 的 StoreGeneratedPattern 設置為 Identity ,也就是表示這個鍵的id值是數據庫自增的 ,我們來試試

image

 

提示報錯了

image

我們來看看EF給我們生成的mysql是如何的

image

我們把他生成的 sql 語句, 丟到 mysql 里面跑一下 , 居然在 mysql 里面 能成功添加一條數據到表里面

image

我們來仔細看看 sql語句  ,為了方便,我添加了一個  SELECT LAST_INSERT_ID();   用於查看到底 這個最近添加的id的值是多少,結果是默認值0

image

整個sql最后的查詢結果 userid 是空的

image

由於我們是使用EF來保存,他最后返回的 userid 是要 保存到剛才我們的實體里面做主鍵的,但是主鍵能為 空值 么? 很顯然是不可以,所以 EF 認為這個批量執行過程沒成功,直接報錯了  . 但是我們在 mysql里面的時候,由於只是執行sql語句, 不存在EF那樣的主鍵判斷,所以 mysql 中就能成功添加一條記錄.

那在EF5中 怎么才能拿到這個 用觸發器 來生成的主鍵id ?  其實這里有個坑,那就是  通過觸發器生成的主鍵id ,你想通過 我們平時的 SELECT LAST_INSERT_ID(); 是根本拿不到的,如果是在 實際的開發過程中,盡量要避免用 觸發器來生成id這個值.

但是好在我這里只是用來導入數據,所以我在我的 c# 代碼里面,直接用 max函數 查詢出剛才生成的 用戶id就可以了

我們還是把 userid的  StoreGeneratedPattern 再次設置為 none    這個 None:表示不處理image

然后我們在c#代碼里面 使用    Database.SqlQuery 方法,直接執行sql語句,返回剛剛增加到數據庫生成的 userid 的值  (這里是隨便用用可以這么做,實際做開發的時候,是不可以這么搞的,用 觸發器來生成 主鍵 id  不怎么可行 )

image
 

下面是一個老外,也是掉到了這個坑里…

http://blog.devart.com/set-identity-and-computed-properties-in-entity-framework-without-triggers.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM