net的曲线救国,学习路径 MVVM (二)

net的曲线救国,学习路径 MVVM (一)

net的曲线救国,学习路径 MVVM (二)

 

前面浅谈了MVVM的一些相关知识点,现在就开始走入这殿堂,以后你将会在这找地方立足。

最先的是EF(Entity Framework),理解起来呢,就是去定义类,并且是类的实体,然后把类的实体和数据库的关系做绑定。

就为了偷懒不是吗,EF应用是为了不写SQL操作的语句,比如Update,Insert into的Execute执行的处理语句。

其实嘛写SQL没啥不好的,小项目,我有大概五张表,然后其中业务表就两三张左右,Insert,Update,Delete满打满算就是十几个

Update table1 set x1=1 where id=1
Insert into table1 (id) values (1)
Delete from table1 where id=1

SQL Helper完整一套,你不用操心关于处理SQL语句问题,甚至什么数据库锁啥的,最多就是在考虑业务是否真需要执行数据库的事务关系,但既然是小项目所谓的事务正常是没啥必要了,为什么没必要,就因为它小,需求那么简单,你不是要求我处理银行支付业务或者线性极强的事务逻辑吧。

所以基本完全不担心,SQL语句直接处理能搞定的,你还不用,那你的逼格确实很高,简单小工具能做成几千万业务量的项目,我看好你。

但你别忘了,那是你自己的小项目小程序,你老板不是吃干饭长大的,他的理想也不是你这小小码字程序员能揣测的。

几千万是没有,几百万那基本没跑。

所以他拉项目,做启动会,肯定是研究一套不管什么项目都有人能维护,不管你走还是你儿子走,都有人能够维护的。

SQL处理语句,也不是说不好做,不好维护,很多公司也是用这种套路,没问题。

但总有一些人会在处理SQL语句方式上开始各种研究,EF和Linq方式就冲在最前了。

说白了就是有些人嫌弃原始的SQL处理太单一了,SQL语句太直观,看起不够高端,涉及性能的查询,关系复杂处理,比如Join的表关联就要使命的玩你数据库的性能问题,当然这个在EF处理也没见能够自动优化掉呀,还有SQL语句写的都是硬编码,啥是硬编码就是要修改问题,就的重新编译重写发布,可EF你也一样啊,难道你就不用重新发布?所以谁也别笑谁了。

问题在于EF的绑定关系有了实体,我VS编译器能够自动智能字段表等提示等等,你SQL硬编码还是低了一个层次。

我EF是代码革命,有问题全部封装,比如它在处理数据的时候能否有数据延迟处理,SQL直接查询就不行,语句执行就在那里,你Get一下数据就跑一下,这雷打不动的规矩就是这样定的。

我EF想什么处理业务,统统都好搞,而SQLHelper呢,就那样,说白了,你可以这么想,其实就是EF在SQL真的与数据库交互的时候它调用了一下SQL Helper里的功能,其他的就是按代码的讨论,添砖加瓦整了这么一个东西出来。

所以论档次是逼格算高了,不再是简简单单的处理数据那样简单。

而MVVM逼格这么高,框架这么高大上,用你SQL Helper是有掉身份的,可能会把千万的项目做成几万的效果。老板想要给你涨工资都要纠结一年,所以你就得改,你就得学,没办法人家都认为它是主流的套件,你非要自己造轮子,那随便你。

EF的学习资料很多,反正我不可能全认识,但几个基础姿势你要学好,要摆成什么骚样你自己喜欢就行。

EF配置是必须的,继承DbContext是上下文的意思,实际上这个东西都是外国的,对我们来说理解不来。你就先看成是包装好的类,就是专注于处理数据库的相关操作就行了,管他上还是下,咬文嚼字如果能否真搞懂也是不错的。跟深层的是继承EntityFramework.dll里面的东西。总之配置进去,不管是MSSQL,Oracle,MYSQL,Sqlite,主流的它都应该支持

    public class DemoDbContext : DbContext {
        public DemoDbContext(string dbName) : base(CreateConnection(dbName), true) { }
        public DemoDbContext(string nameOrConnectionString, bool token) : base(nameOrConnectionString) { }

        static DbConnection CreateConnection(string dbName) {
            var filePath = GetFile(dbName, DataFolderName);
            try {
                var attributes = File.GetAttributes(filePath);
                if(attributes.HasFlag(FileAttributes.ReadOnly)) {
                    File.SetAttributes(filePath, attributes & ~FileAttributes.ReadOnly);
                }
            } catch { }

            return new SQLiteConnection {
                ConnectionString = new SQLiteConnectionStringBuilder { DataSource = filePath }.ConnectionString
            };
        }

    }

然后配置DbSet对应实体,这个走到哪对应到那,有点你需要注意的是,这里对应的是<Customer> 在数据库设计的时候是要用复数的表名,大部分是s复数结尾,有些用es结尾,这个看你英语老师有没有教你,如果没有偷偷约出来灌他两瓶五粮液再让他教你。

  public DbSet<Address> Address { get; set; }
  public DbSet<Customer> Customers { get; set; }

 还有映射关系,override void OnModelCreating 这个EF采用配置的方式,就不用SQL语句处理完后各种奇葩表主从关联的数据填充,这块可以参考 dudu的Entity Framework 实践系列讲解,够你喝一壶的

 protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<TaskAttachedFile>()
                .HasOptional(t => t.EmployeeTask)
                .WithMany(p => p.AttachedFiles)
                .HasForeignKey(t => t.EmployeeTaskId)
                .WillCascadeOnDelete(true);

            modelBuilder.Entity<CustomerEmployee>()
                .HasMany(x => x.EmployeeTasks)
                .WithOptional(x => x.CustomerEmployee);

            modelBuilder.Entity<Employee>()
                .HasOptional(x => x.Picture)
                .WithMany(x => x.Employees);
        }

这样基本EF的入门框架就可以展开了,先学习,这个是必经过程,学过了的话,再巩固一遍,有好处没坏处,虽然我自己都忘得差不多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值