介绍
EF是微软基于ADO.NET开发的ORM框架。
ORM对象关系映射,是将实体对象与数据库数据进行映射。这样不需要写sql,仅仅对实体对象进行修改就可以改变数据库数据。
使用
引用
这个visual studio集成,可以手动添加实体模型
增删改查
查询
//方法一 Linq to Entities
var info = from p in db.dat_online_sh where p.KeyId != "" orderby p.KeyId descending select p;
foreach (var item in info)
{
}
// 方法二:Lamada表达式
var info2 = db.dat_online_sh.Where<dat_online_sh>(p => p.KeyId != "").OrderByDescending(p => p.KeyId);
foreach (var item in info)
{
}
// 方法三:db SQL Language
string strSQL = "SELECT value a FROM dat_online_sh as a WHERE a.KeyId!='' ORDER BY a.ID DESC";
var info3 = ((IObjectContextAdapter)db).ObjectContext.CreateQuery<dat_online_sh>(strSQL);
foreach (var item in info)
{
}
// 方法四:SqlQuery
try
{
string strSQL2 = "SELECT * FROM dat_online_sh WHERE KeyId!='' ORDER BY KeyId DESC";
var info4 = db.Database.SqlQuery<dat_online_sh>(strSQL2);
foreach (var item in info)
{
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
增
//单条
Region region = new Region();
region.RegionID = 5;
region.RegionDescription = "青岛";
db.Region.Add(region);
db.SaveChanges();
//多条
List<Region> regions = new List<Region>();
regions.Add(new Region { RegionID = 6, RegionDescription = "济南" });
regions.Add(new Region { RegionID = 7, RegionDescription = "合肥" });
regions.Add(new Region { RegionID = 8, RegionDescription = "天津" });
db.Region.AddRange(regions);
Response.Write(db.SaveChanges());
for (int i = 10; i < 20; i++)
{
Region region = new Region();
region.RegionID = i;
region.RegionDescription = $"第{i}条";
db.Region.Add(region);
}
Response.Write(db.SaveChanges());
删
//用Remove()方法时,必须先从EF中查到才能删除
UserInfo user = from u in context.UserInfo where u.Id=343 select u;
context.UserInfo.Remove(user);
// 用这种方法不用先查再删除,其实内部做了查询,推荐用这种;
UserInfo user = new UserInfo(){Id=343};
context.Entry<UserInfo>(user).State = System.Data.EntityState.Deleted;
改
//先New一个实体对象,加入需要修改的属性,加入主键值
CompanyAddr DefaultData = new CompanyAddr
{
id = 1,
IsDefault = true //需要修改的值
};
//方法一:实体对象所有属性均有赋值,或者不赋值但存在默认值的,结果将会修改为默认值,或者为null
db..Entry<CompanyAddr>(DefaultData).State = System.Data.EntityState.Modified;
//方法二:实体对象部分属性均赋值
//添加到EF管理容器中,并获取 实体对象 的伪包装类对象
DbEntityEntry<CompanyAddr> entry = db.Entry<CompanyAddr>(DefaultData);
//如果使用 Entry 附加 实体对象到数据容器中,则需要手动 设置 实体包装类的对象 的 状态为 Unchanged**
entry.State = EntityState.Unchanged;
//标识 实体对象 某些属性 已经被修改了
entry.Property("IsDefault").IsModified = true;
//方法三:
//直接针对属性进行状态设置,但是当前对象并没有被上下文跟踪
contextState.Set<CustomerInfo>().Attach(customerState);
//标识 实体对象 某些属性 已经被修改了
contextState.Entry<CustomerInfo>(customerState).Property("customerName").IsModified = true;
//关键性的注意点来了,这里针对的是方法二、三!
//关闭验证实体有效性(ValidateOnSaveEnabled)这个开关
//因为New的一个新实体对象,里面肯定很多值不会修改,而默认是空的情况;
//再进行SaveChanges的时候,会进行实体验证,这个时候就会出错
//当然,如果是你需要修改的数据输入值真的有问题,也是不能修改成功的,例如上面的IsDefault 不赋值为未布尔型,还是会报错的
db.Configuration.ValidateOnSaveEnabled = false;
db.SaveChanges();
//恢复验证实体有效性(ValidateOnSaveEnabled)这个开关【如果后续有其他操作,记得恢复】
db.Configuration.ValidateOnSaveEnabled = true;