EntityFramework-CURD in (dis)connected mode

参考链接:http://www.entityframeworktutorial.net/EntityFramework5/entity-framework5-introduction.aspx

Connected Mode

Context detects adding and deleting entity, when the operation is performed only on DbSet. If you perform add and delete entity on a separate collection or list, then it won't detect these changes.

使用dbset将会探测到更改信息并能更新到数据源:

var studentList = context.Students.ToList();

context.Students.Add(new Student() { StudentName = "New Student2" });

使用list是不能直接更新数据源:

studentList.Add(new Student() { StudentName = "New Student" });

性能考虑,不必将AutoDetectChangesEnabled一直设置为true,可在需要时显示调用:

if you only need to read the records(i.e.you won't write them back) you will gain a performance boost by turning of change tracking for your context:

yourDbContext.Configuration.AutoDetectChangesEnabled = false;

Do this before loading any entities. If you need to update the loaded records you can allways call

yourDbContext.ChangeTracker.DetectChanges(); before calling SaveChanges().

DisConnectedMode

DbSet.Add():

//disconnected entity graph

Student disconnectedStudent =newStudent() { StudentName ="New Student"};    disconnectedStudent.StudentAddress =newStudentAddress() { Address1 ="Address", City ="City1"};

using(var ctx =new SchoolDBEntities())  

  {

//add disconnected Student entity graph to new context instance - ctx

ctx.Students.Add(disconnectedStudent);// get DbEntityEntry instance to check the EntityState of specified entity

var studentEntry = ctx.Entry(disconnectedStudent);

var addressEntry = ctx.Entry(disconnectedStudent.StudentAddress);

Console.WriteLine("Student EntityState:{0}",studentEntry.State);

Console.WriteLine("StudentAddress EntityState: {0}",addressEntry.State);   

 }

如上代码将离线生成的disconnectedStudent实体添加到在线dbset中,并更新实体的State为Added,然后调用ctx.Savechanges()方法即可将添加的实体更新到数据源中。

DbSet.Attach():

Attach方法的使用与Add类似,区别是Attach方法不会将State更新为Added或者其他,需要通过DbContext.Entry(disconnectedEntity).state = EntityState.Added/Modified/Deleted/Unchanged方法手动修改添加的实体的状态。

DisconnectedInsert

DIsconnectedUpdate

离线更新数据步骤:

1.从数据库中获取已有的对象实体(关闭数据库连接);

2.在数据库连接生命周期之外修改实体的属性;

3.重新连接数据库,设置此对象实体的状态为Modified。

注意:EF要求所有表都要有主键,通过主键将离线更新的实体与数据库中实体建立对应关系,将离线实体更新后的属性更新到数据源。所以在更新数据时,不要更新主键,若强制更新主键,若存在更新后主键对应的对象,ef将会更新新主键对应的对象,而不是在第一步中获取的对象。若不存在更新后主键对应的对象,则抛出异常,记录不存在或者已被删除。

4.调用SaveChanges()保存更改

Student stud;

//1. Get student from DB

using(varctx =newSchoolDBEntities())

{    stud = ctx.Students.Where(s => s.StudentName =="New Student1").FirstOrDefault

();}

//2. change student name in disconnected mode (out of ctx scope)

if(stud !=null){    stud.StudentName ="Updated Student1";}

//save modified entity using new Context

using(vardbCtx =newSchoolDBEntities()){

//3. Mark entity as modified

dbCtx.Entry(stud).State = System.Data.Entity.EntityState.Modified;

//4. call SaveChanges

dbCtx.SaveChanges();}

EntityFrame注意事项

1.Understand that call to database made only when the actual records are required. all the operations are just used to make the query (SQL) so try to fetch only a piece of data rather then requesting a large number of records. Trim the fetch size as much as possible

2.Yes, not you should, you must use stored procedures and import them into your model and have function imports for them. You can also call them directly ExecuteStoreCommand(), ExecuteStoreQuery<>(). Sames goes for functions and views but EF has a really odd way of calling functions "SELECT dbo.blah(@id)".

3.EF performs slower when it has to populate an Entity with deep hierarchy. be extremely careful with entities with deep hierarchy .

4.Sometimes when you are requesting records and you are not required to modify them you should tell EF not to watch the property changes (AutoDetectChanges). that way record retrieval is much faster

5.Indexing of database is good but in case of EF it becomes very important. The columns you use for retrieval and sorting should be properly indexed.

6.When you model is large, VS2010/VS2012 Model designer gets real crazy. so break your model into medium sized models. There is a limitation that the Entities from different models cannot be shared even though they may be pointing to the same table in the database.

7.When you have to make changes in the same entity at different places, try to use the same entity by passing it and send the changes only once rather than each one fetching a fresh piece, makes changes and stores it (Real performance gain tip).

8.When you need the info in only one or two columns try not to fetch the full entity. you can either execute your sql directly or have a mini entity something. You may need to cache some frequently used data in your application also.

9.Transactions are slow. be careful with them.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容