EF4.0自跟踪实体使用小结
鉴于英文不好,英文的文献读起来实在吃力,于是一些概念不是十分理解,诸如:上下文与实体视图的关系等理解不很深入。自己做的简单的增删改的例子,记录下来,以强化理解。
1、采用的是DBFirst的建模方式,
数据表结构如下:
CREATE TABLE [dbo].[登记件表](
[登记编号] [nvarchar](50) NOT NULL PK,
[批号] [nvarchar](50) NULL)
CREATE TABLE [dbo].[查封表](
[登记编号] [nvarchar](50) NOT NULL PK FK,
[文件] [nvarchar](50) NULL,
[文号] [nvarchar](50) NULL)
2、新增
2.1新增一个主表记录
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = new Ent登记件(); //这里会自动将ent登记件的状态置为Added,所以不需要AddTo**s方法或者AddObject方法
ent登记件.登记编号 = "001";
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
ent登记件.AcceptChanges();
}
或者
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = new Ent登记件();
ent登记件.登记编号 = "001";
}
using (MyEntities entiry = new MyEntities())
{
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
ent登记件.AcceptChanges();
}
说明:这里两种新增方式的不同,是使用同一个contex和不同contex的区别
2.2新增一个主表和一个从表记录
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = new Ent登记件();
ent登记件.登记编号 = "001";
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
或者
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = new Ent登记件();
ent登记件.登记编号 = "001";
Ent查封 ent查封 = new Ent查封();
ent查封.查封文号 = "111";
ent登记件.查封 = ent查封;
}
using (MyEntities entiry = new MyEntities())
{
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
3、修改
3.1修改主表记录
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
//ent登记件.StartTracking(); //该语句可有可无
ent登记件.批号 = "123"; //这里会将ent登记件的状态由Unchanged修改为Modified
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
ent登记件.AcceptChanges();
}
或者
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
ent登记件.StartTracking(); //该语句不可缺少,用于开启状态跟踪
ent登记件.批号 = "123"; //这里会将ent登记件的状态由Unchanged修改为Modified
}
using (MyEntities entiry = new MyEntities())
{
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
}
}
3.2修改从表记录
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
//ent登记件.StartTracking();
entity.LoadProperty(ent登记件, c => c.查封);
//ent登记件.查封.StartTracking();
ent登记件.查封.文号 = "张三";
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
或者
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
ent登记件.StartTracking();
entity.LoadProperty(ent登记件, c => c.查封);
ent登记件.查封.StartTracking();
ent登记件.查封.文号 = "张三";
}
using (MyEntities entiry = new MyEntities())
{
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
3、删除
3.1删除主表记录
错误用法:
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
ent登记件.MarkAsDeleted(); //这里会将ent登记件的状态由Unchanged修改为Deleted,该语句可以自动打开ent登记件.StartTracking();
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
ent登记件.AcceptChanges();
}
该方法删除记录时,没有发现不妥的地方,但是saveChanges值始终为0,也就是说数据库中的记录并没有真的删除,具体原因不详,如有知道的朋友请赐教。
以下为正确用法:
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
}
using (MyEntities entiry = new MyEntities())
{
ent登记件.MarkAsDeleted();
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
}
}
3.2删除从表记录
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
entity.LoadProperty(ent登记件, c => c.查封);
ent登记件.查封.MarkAsDeleted();
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
或者
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
entity.LoadProperty(ent登记件, c => c.查封);
}
using (MyEntities entiry = new MyEntities())
{
ent登记件.查封.MarkAsDeleted();
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
删除主表记录和它对应的所有从表记录
Ent登记件 ent登记件 = null ;
using (MyEntities entiry = new MyEntities())
{
Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
entity.LoadProperty(ent登记件, c => c.查封);
}
using (MyEntities entiry = new MyEntities())
{
ent登记件.MarkAsDeleted();
entiry.Ent登记件集.ApplyChanges(ent登记件);
int saveChanges = entiry.SaveChanges();
if( saveChanges > 0 )
{
ent登记件.AcceptChanges();
if(ent登记件.查封!=null)
ent登记件.查封.AcceptChanges();
}
}
总结:这里对常用的增删改进行了列举,当然其它的用法还有很多,另外查询的方法这里也有涉及,以后有新的用法再具体补充。