如何使用EF?

Posted 水墨晨诗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用EF?相关的知识,希望对你有一定的参考价值。

新建好项目之后 → 右击类库 → 新建项 → ADO.NET实体数据模型(在Visual C#项中) → 从数据库生成 → 选择你要映射的数据库的数据源(将 『是,在连接字符串中包含敏感数据』勾上) → 选中要映射的表、视图、存储过程。


 

以上是准备工作!

下面是使用!

//1、声明一个EF的上下文
            MyTestEntities1 dbcontext = new MyTestEntities1();
//dbcontext.Database.Connection.ConnectionString = "";//重新设置数据库连接字符串(对于非常重要数据库,如银行的账号密码等,需要对数据库字符串进行密钥加密的,可以在这里解密后重新赋值)
技术分享
 //2、声明一个User实体
            //USERS user = new USERS();
            //user.NAME = "vichin";
            //user.SEX = "男";
            //user.DATE = "19921126";
            //user.ID = 4;
            //user.NUMBER = 4;

            //3、告诉EF,咱们对实体的做一个插入操作
            //dbcontext.USERS.Add(user);   

            //3、告诉EF,咱们对实体的做一个删除操作
            //dbcontext.USERS.Remove(user);
做一个 添加/删除 操作

 

技术分享
            //2、声明一个实体
            USERS user = new USERS();            
            user.SEX = "";
            user.NAME = "vichin";
            user.DATE = "19861112";
            user.ID = 4;   
            
            //3、告诉上下文咱们要对此实体进行更新操作
            
             #region 对一整行数据进行更行
            dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;//要做删除的话,只需要将modified改写成Deleted
    
             #endregion
 
            #region 对一行数据中,某个字段进行更新
            dbcontext.USERS.Attach(user);//将新的user对象附加到上下文中来,进行管理
            dbcontext.Entry<USERS>(user).Property<string>(u => u.NAME).IsModified = true;  // EF5.0之后的写法(VS2012开始使用)
            dbcontext.Entry<USERS>(user).Property("NAME").IsModified = true;//EF4.0的写法(VS2010中的写法) 
           #endregion  
做一个更改操作

 

 

 

//4、告诉上下文把实体的变化保存到数据库(执行SQL脚本)
            dbcontext.SaveChanges();

 在对数据库进行删除、更新操作时,一定要将所有的非空字段(实体的属性)赋值,即使在更新的时候用不到那个字段,也得赋值。

下面是常见错误(部分)


 

报错: Unable to update the EntitySet ‘USERS‘ because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

报错:从 ObjectStateEntry 中检索值时出错。有关详细信息,请参阅内部异常。

 

原因:报这个错的原因是表中没有主键!


————————————————————————————————————————————
代码:dbcontext.Entry<USERS>(user).State = System.Data.EntityState.Modified;

报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"

原因:这行代码是EF5.0中的写法,如果用的是6.0则需要写成
dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;


————————————————————————————————————————————
报错:对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

原因:实体的非空属性没有全部都被赋值,或者是数据的长度超过了定义的类型 (NVARCHAR 100)


————————————————————————————————————————————
报错:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager项

原因:要操作的数据在数据库并不存在。(例如:要删除一个ID为9999的数据,可是当前数据库中并没有ID为9999的数据)








以上是关于如何使用EF?的主要内容,如果未能解决你的问题,请参考以下文章

EF 开始的片段时有问题 具有潜在运行时冲突

如何在 .SaveChanges() 期间首先使用 EF 代码记录所有实体更改?

MVC 5 - 如何首先使用 EF 代码更新关系表

.NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程

如何在使用EF代码的.SaveChanges()期间记录所有实体更改?

如何改造基于非通用的 EF Core 代码以使用通用 IQueryable