关于这段时间学习 EntityFramework的 一点感悟

  Ado.Net,用了N多年,Entity Framework也关注了很多年。 每当项目转型的时候,就花费大巴的时间,学习一番,潮流的东西。 这个Orm很多,这个EF很火,这么多年了,我还是不敢用,虽然比当年好多了。

  当年也就是12年的时候,实体类是乱七八糟的一大堆,属性里是带功能的,不是单纯的实体类。而且,其他数据库支持的不是特别好。现在,实体类清丽了 很多,想着,用一下吧,却又把我吓到了,其实也没有特别的不好,只是太乱了。 EF 官方的增删该查,最好的就是查询,剩下的三个,不敢恭维,基本的功能还行,如果涉及到批量的操作,就没辙了(自己写扩展除外)

 

  据说,Entity Framework.Extend 扩展的不错,社群里,一大票人都知道,也都看过,怎么到我这,就是越看越不敢用,越看越不放心了。  

 

  批量操作,可以说是一大特色,却这个批量操作,写起来倒是很顺溜,仔细一研究,他是直接就生成sql语句执行了,而且还是自己生成了个Command执行的,EF的拦截器根本拦截不到

  缓存,倒是挺不错的,这也是个重要的功能,也就是用了EF.Extend的缓存

  AuditLog,这个日志审计功能,完全就不该存在,这样说是因为,通过批量操作的,都无法 审计记录。

 

  为什么,我不敢用EF呢?

  前些年是DataBase First,后来是Mode First,现在是Code First,既然这样迭代,肯定是EF在改进。但是,我觉得,越改越凌乱了。Code First,让代码更加的繁琐了,关键是,C#代码声明的实体映射与数据库不一样,是会报错的,例如,字段的长度 不一样。而,我只是想 用一下 linq 的溜溜的写法,不再去拼接sql语句。用了EF之后,太多的束缚,如果EF能精简就好多了,而我又精力有限,写不了 Orm 了。 只能自己写Sql了。

 

  其实,我需要的只是,一个精简的EF

 

  个人觉得,我自己写的代码,除了不能Linq,其他的都还好,有 延迟加载,有缓存,有实体生成工具。

  这样挺好,待下次了再学习EF 吧。如果哪个项目,必须要用EF,那我就跟着大拿用吧,让我自己用,肯定是不会用的。  

 

 

 有这么个业务逻辑,怎么实现

1 如果用EF,写这么个逻辑是没办法正常执行的
2 1、先保存一个对象
3 2、删除ID>5的数据
4 3、保存一个对象
5 4、修改ID>5的对象,(条件里包含第一次保存的对象)
6 然后,EF,貌似实现不了这样的事务

 

 

 正常的代码应该是类似这样的

 1  using (TransactionScope transaction = new TransactionScope())
 2             {
 3                 t.Area.Add(new Area() { Code = "A", Name = "A" });
 4                 var dfe4 = from a in t.Area where a.Id > 5 select a;
 5                 dfe4.Delete();
 6                 t.Area.Add(new Area() { Code = "B", Name = "B" });
 7                 (from a in t.Area where a.Id > 5 select a).Update(a2 => new Area() { Name = "IM:" });
 8 
 9                 var f234 = from a in t.Area where a.Id > 5 && a.Name == "IM:" select a;
10                 Area a234 = f234.First();
11                 if (a234 != null)
12                 {
13                     a234.Name = "IM:234";
14                     Area a235 = f234.Where(e => e.Id == a234.Id + 2).FirstOrDefault();
15                     if (a235 != null)
16                     {
17                         t.Area.Remove(a235);
18                     }
19                 }
20                 t.SaveChanges();
21                 Console.WriteLine("------------");
22                 Console.ReadLine();
23                 transaction.Complete();
24             }

 

 

这是使用了 EntityFramework.Extend的写法。 这样执行会有问题么?

请看这两张图

 

执行顺序不对你说,如果是在一个系统内,恰好有先后顺序的依赖关系,那就真的出问题了。

 

posted @ 2016-07-13 18:41 郑延杰 阅读(...) 评论(...) 编辑 收藏