環境: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追蹤)