配置使用EF6.0常见的一些问题及解决方案
前言
最近做了個(gè)winform小項(xiàng)目,為方便快速開發(fā),后臺(tái)框架使用了ef6.0+sqlserver2008架構(gòu),遇到各種問題,真是傷腦筋。現(xiàn)將遇到問題和解決方案寫下來,方便查閱
提示未注冊,找不到驅(qū)動(dòng)程序
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file.
?
這個(gè)問題比較坑,我根據(jù)上面的提示,跑到配置文件去查看,看有沒有entutyFramework節(jié)點(diǎn),是否注冊驅(qū)動(dòng)。結(jié)果按照網(wǎng)上的解決方案把配置文件貼上去了還是報(bào)錯(cuò),然后再查看EntityFramework.SqlServer.dll是否已經(jīng)引用到數(shù)據(jù)訪問層類庫中,也在。這下就懵逼了,到底是什么情況,網(wǎng)上各種搜,比如把EntityFramework.SqlServer.dll的賦值到本地屬性設(shè)為True后還是沒有用,折騰了個(gè)把小時(shí),最后突然看了一眼bin\Debug目錄,發(fā)現(xiàn)只有一個(gè)EntityFramework.dll文件,沒有EntityFramework.SqlServer.dll,我就瞬間釋然了,原來是這樣。。。
解決方案:
1.檢查是否引入EntityFramework.dll 和EntityFramework.SqlServer.dll
2.檢查是否設(shè)為復(fù)制到本地屬性為True
3.檢查配置文件是否注冊驅(qū)動(dòng)
如我的是sqlserver數(shù)據(jù)庫:
<providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers>如果是mysql
<providers><provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider></providers>將上面這段代碼放到<entityFramework>節(jié)點(diǎn)下面就可以了,并且要引入幾個(gè)dll
4.查看編譯后的目錄中是否有這2個(gè)dll,如果沒有,手動(dòng)拷貝進(jìn)去
提示表名無效
?有時(shí)候新加了一個(gè)實(shí)體類,數(shù)據(jù)庫也相應(yīng)加了一個(gè)表。然后理所當(dāng)然的運(yùn)行增加數(shù)據(jù),結(jié)果就出現(xiàn)這提示
?排查過程
?然后又是一陣排查,再次確認(rèn)了數(shù)據(jù)庫中確實(shí)存在表,還手動(dòng)存進(jìn)去了一條數(shù)據(jù)。再跑到BaseContext:DbContext這個(gè)類里面一陣翻,確定已經(jīng)有? public DbSet<Employee>a_Emp { get; set; }這個(gè)屬性了。又跑到實(shí)體類中確認(rèn)字段是否吻合,主鍵[key]標(biāo)記是否已經(jīng)標(biāo)了。最后又對比了之前的項(xiàng)目2個(gè)實(shí)體之間的差別。最后終于發(fā)現(xiàn)。。。實(shí)體類沒有和數(shù)據(jù)庫關(guān)聯(lián)
?
解決方案
1.確認(rèn)數(shù)據(jù)庫表是否存在
2.確認(rèn)BaseContext:DbContext類中是否有屬性
3.確認(rèn)實(shí)體類中字段與主鍵
4.確認(rèn)實(shí)體與數(shù)據(jù)庫表是否關(guān)聯(lián)
?
[Table("a_Emp")]public class Employee另:實(shí)體類上面的[table]小括號里面的就是數(shù)據(jù)庫的表名,并且該標(biāo)記需要引用dll
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema;?數(shù)據(jù)庫字段記錄為null時(shí) ef 操作數(shù)據(jù)庫報(bào)錯(cuò)
? ?
錯(cuò)誤排查
這個(gè)問題是數(shù)據(jù)庫字段為空導(dǎo)致的,ef 反射賦值時(shí)實(shí)體時(shí)發(fā)生的錯(cuò)誤,如:ToList()、
_db.Set<TEntity>().AddRange(entry);
_db.SaveChanges();
解決方案
2種任選一種
1.將數(shù)據(jù)庫所有字段都賦值,不存在為空的情況 自然不會(huì)報(bào)錯(cuò),但畢竟繁瑣
2.將數(shù)據(jù)庫中可空字段再實(shí)體中用可空類型表示
如:
public DataTime? CreateTime{get;set;} public int? Num{get;set;} public decimal? Pirce{get;set;}目前我知道的就這2種,應(yīng)該夠用了
EF中的外鍵
?外鍵是常用的數(shù)據(jù)關(guān)聯(lián)形式,在數(shù)據(jù)訪問中占據(jù)重要位置,下面來看看使用外鍵的幾個(gè)步驟
一、將2個(gè)實(shí)體類都準(zhǔn)備好,一個(gè)主鍵表一個(gè)外鍵表,例如 員工表中需要部門編號 那么就需要準(zhǔn)備員工類和部門類
二、在員工實(shí)體類Employee中加入一個(gè)對象實(shí)體,加一個(gè)部門Id,沒錯(cuò),不是一個(gè)單純的部門ID 而是實(shí)體
[Key]public int EmpId { get; set; }/// <summary>/// 姓名/// </summary>public string EmpName { get; set; }/// <summary>/// 性別/// </summary>public string Sex { get; set; }/// <summary>/// 生日/// </summary>public DateTime BirthDay { get; set; }/// <summary>/// 部門/// </summary> public int DepId { get; set; }/// <summary>/// 關(guān)聯(lián)主表/// </summary>[ForeignKey("DepId")]public Dept Dept { get; set; } //注意:ForeignKey("DepId")中的DepId 就是員工類的外鍵
四、Dept部門表中必須有主鍵
五、調(diào)用的時(shí)候
db.a_Emp.Include("Dept").Where(l => l.Dept.name.Contains(name)||string.IsNullOrEmpty(name)).ToList()其中a_Emp是員工類的實(shí)體對象,在baseContext里面的?public DbSet<Employee>a_Emp { get; set; }
Dept.name是可以直接點(diǎn)出來的了
?HttpContext.User.Identity.IsAuthenticated一直為false
使用mvc時(shí)會(huì)用到權(quán)限控制,并且存cookie,然后一般會(huì)出現(xiàn)下面的一段代碼
protected override void OnActionExecuting(ActionExecutingContext filterContext){var request = filterContext.HttpContext.Request;var response = filterContext.HttpContext.Response;currentUser = new AdminUser();if (filterContext.HttpContext.User.Identity.IsAuthenticated){long.TryParse(System.Web.HttpContext.Current.User.Identity.Name, out userid);if (userid > 0){currentUser = AdminUserDAL.getEntryById<AdminUser, long>(userid);currentUser.allprivileges = AdminUserDAL.getUserPrivilegeAll(-1, userid);myPermissionList = currentUser.allprivileges;}}else //返回登錄頁 {response.Redirect("/Acount/Login");}一直為false的時(shí)候就會(huì)出現(xiàn)始終跳到登錄頁,就算調(diào)試也找不到為什么會(huì)這樣
解決方案
? ?在webconfig文件的system.web節(jié)點(diǎn)下面加入節(jié)點(diǎn)就行了
<authentication mode="Forms"><forms loginUrl="~/Home/Login" name="paochi.com" timeout="300" protection="All" path="/" requireSSL="false" slidingExpiration="false" enableCrossAppRedirects="false" cookieless="UseCookies" /></authentication>里面的內(nèi)容可以自己根據(jù)需要配置
總結(jié)
以上是我遇到的眾多問題之一,限于篇幅和時(shí)間,暫時(shí)就記錄到這里吧。如果有什么理解錯(cuò)誤的地方,還望指正!!!
請關(guān)注我的博客地址:http://www.cnblogs.com/jingch?給個(gè)贊吧!
轉(zhuǎn)載于:https://www.cnblogs.com/jingch/p/4949210.html
總結(jié)
以上是生活随笔為你收集整理的配置使用EF6.0常见的一些问题及解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS中货币高精度要求使用NSDecia
- 下一篇: 简单新闻发布系统