EF遇到的一些問題


環境:EntityFramework 版本號:4.1.0.0

問題一:“數據讀取器與指定的“。。。.。。。”不兼容。某個類型為“。。。”的成員在同名的數據讀取器中沒有對應的列。”。

使用方式:rep.context.Database.SqlQuery<T>(sql, pList.ToArray<object>()); //sql       是直接字符串拼接的

問題原因:T 是個視圖,因為數據庫中的字段是有前綴"C_",而生產實體的時候 我們做了去前綴的操作。導致 字段對應不上。

解決方案:在拼寫sql 字符串的時候 把有前綴的字段 起個別名去掉前綴。如: C_DISP_TYPE_NM as DISP_TYPE_NM。

 

問題二:“V_CLAIM_DISPATCH 的“MAIN_STAT”屬性不能設置為“Int64”值。必須將該屬性設置為類型為“Int32”的非 null 值”

使用方式:var surveyList = claimBiz.FindAll<V_CLAIM_DISPATCH>(sqlText, pList); 

問題原因:【不明】猜想可能原因是,數據庫是number(10),生成的實體是int。而實際讀出來的數據要對應int64。但那個字段類型的映射是EF自動完成的,不能人為修改。所以報錯。

解決方案:重新寫個類V_CLAIM_DISPATCH_COPY  標志字段 Nullable<Int64> MAIN_STAT。上面的使用方式 var surveyList = claimBiz.FindAll<V_CLAIM_DISPATCH_COPY  >(sqlText, pList);  把泛型改成自定義類。

 

問題三:多對多 新增數據時 對應關系表也會增加一條數據。

例如:科目表 有語文 數學,我新增一條學員信息 對應科目語文。更新成功后科目表 也會重新新增一條”語文“的信息。

問題原因:在添加 學員信息時  查詢的科目 語句用到了 AsNoTracking (即 不被實體被EF context追蹤,查詢出來的實體不能直接用於更新和刪除,否則報錯)。參考資料 1 2 3

解決方案:在查詢科目 的時候  把 AsNoTracking  這個方法去掉。[然后有出現了 問題四 ]

 

問題四:一個實體對象不能由多個 IEntityChangeTracker 實例引用

問題原因:在添加Add 實體時 在實體的 導航屬性添加了 關系實體。 查詢資料:1

如: var modelMyBlogs = new Model.MyBlogs(){}; 

      modelMyBlogs.BlogTags.Add(itemBlogTag);

       blog.Add(modelMyBlogs);

itemBlogTag 是由重新實例DbContext查詢出來的。

解決方案:直接吧DbContext放到session里面或者進程內公用。(我是直接放session里)

 

問題五:查詢異常的慢。

可能原因:

1.數據量大 篩選條件沒有 EntityFunctions.AsNonUnicode   http://www.cnblogs.com/zhaopei/p/4431461.html

2.如果查詢出來的結果集不用更新和修改 可以 在后面加 AsNoTracking 方法(不被實體EF context追蹤)

 


免責聲明!

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



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