二手市场这个小项目是我第一次用EF,边学边写边记录吧

首先明确几个知识点

存储过程

存储过程简单来说,就是为以后的使用而保存的一条或多条SQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据, 删除等等。

为什么要使用存储过程

通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面例子所述)。由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。

数据库索引

在数据库表中,对字段建立索引可以大大提高查询速度。例如在查找username="admin"的记录 SELECT * FROM mytable WHERE username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

主键会被自动建索引

数据库事务

多条sql作为一个整体提交给数据库系统,要么全部执行完成,要么全部取消。是一个不可分割的逻辑单元。

原子性 要么都成功  要么都失败

一致性 事务执行完,数据都是正确

隔离性 两个事务同时操作一张表,B事务要么是在A事务前完成,要么在A事务完成会执行(锁表)

持久性 数据提交后 就固化下来

高并发的系统,死锁其实是不可避免的;(按照固定顺序操作数据,  事务尽量的简短;更不要在事务期间搞什么等待;降低并发;事务里面耗时短;锁的隔离级别;)

回到我们的项目

关于每张表都有一个创建人,创建时间,修改人,修改时间

这种做法是为了以后维护起来方便;如果出问题,直接可以找到最后操作该记录的人

是要看具体需求,如果业务上或者安全性上不太过在乎每个人的操作明细,那么完全可以只记录最后一笔,这样没必要分表。但是如果像银行那种账户进出明细,就有必要做一个明细表来记录了。有些业务对操作明细很注重,所以需要分表,有些仅仅是一种冗余记录,可以没必要注重那么细节。这方面你要结合你们公司的情况具体去体会

注意模型中应有无参构造函数,不然会报错

1,创建属性映射,关系映射

可以像servicestack.ormlite一样使用特性进行标注,但是不推荐,使用FluentApi在OnModelCreating中进行配置,统一管理(我们两个一起用)

了解一下CodeFirst默认约定,可以省点力

NULL column(可空列)               EF会为所有引用类型的属性(不包含主键)创建可空数据列。

Not NULL column(不可空列)     EF为主键属性和不为空的值类型(包括日期类型)创建非空列。

 设置索引https://www.cnblogs.com/jiangyunfeng/p/12682439.html

注意复杂属性ComplexType,复杂类型的每个属性都可以为空,但当作为复杂属性出现时,却是不可以为空的,必须初始化

想图片路径这些本应该是数组,该数据库无法存储此类型故,改成字符串

 2,迁移

(1)

Startup project ‘XXXXXXXX‘ targets framework ‘.NETStandard‘. There is no runtime associated with this framework, and projects targeting it cannot be executed directly. To use the Entity Framework Core Package Manager Console Tools with this project, add an executable project targeting .NET Framework or .NET Core that references this project, and set it as the startup project; or, update this project to cross-target .NET Framework or .NET Core. For more information on using the EF Core Tools with .NET Standard projects, see https://go.microsoft.com/fwlink/?linkid=2034705

在Add-Migration时出现类似错误时,看看默认启动项目是不是不是web,而是类库

(3)

EF Core 迁移时候

没任何提示,只提示Build failed.

1检查是否是启动项目

2检查项目是否有报错的地方

(2)

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

我的解决办法是修改连接字符串为  "Server=localhost;Database=XD_Market;Uid=sa;Pwd =******;"

迁移所用命令行

Add-Migration init -c MarketContext

Update-Database -c MarketContext

Add-Migration init -c EventStoreSqlContext

Update-Database -c EventStoreSqlContext

3数据操作

延迟加载(Lazy Loading) 和淘宝的商品列表一样,下拉刷新,按需加载

饥饿加载 (Eager Loading) 加载父对象时同时加载子对象

显式加载 (Explicitly Loading)当我们禁用了延迟加载,仍然可以通过显式加载来延迟加载相关实体

1,对于标签问题,标签数组存数据库是拼成一个字符串来进行存储,这里想根据一个标签进行查询,可以使用模糊查询

2,商品分类,这个类别我们是用枚举写死了,如果做一个无极限菜单要怎么做呢(不要一级一个表)?

(1)可以使用parentid,三级列表的parentID都记录所属的二级列表的id,这样的话就是用过递归的形式实现

(2)和标签问题相似,采用文件夹路径那种方式,一级存为“path/id1”,二级就是“path/id1/id2”,数据库查询就用模糊查询

题外话:微博的互粉数据库应该怎么存

(1)第一个方法就是表里面有两个属性,关注人与被关注人,互粉就查询两遍看包含关系

(2)第二个

视图的概述

视图是一个虚拟表,其查询的数据来自于视图定义时的 as select xx 查询语句。视图的列来自于一个表或多个表,所以视图不可以和表名重名。
数据多用作查询,一般不会通过视图去修改数据。

项目中应该修改的一些bug

1,对于根据备注(remark)的查询,就用like  %***%模糊查询,还有一个方法是通过lucene分词保存查询

2,根据下面的建议修改索引使用(guid做主键,就用那些有意义的其他数值属性(比如价格时间)作为聚集索引)

数据库优化方案

1,分库分表(表的真实情况是硬盘的一个文件,文件越大,访问越慢)

      分表:垂直分表:就比如我们的Commodity与CommodityDetail

水平分表:将普通商品和悬赏分开两张表就是水平

分库:垂直分库:按业务拆分多个库,用多个服务器来分担压力的

水平分库:拆分多个库,多个库结构是一样的

EF在二手市场中的使用的更多相关文章

  1. 未来-YLB-二手市场:二手市场

    ylbtech-未来-YLB-二手市场:二手市场 1.返回顶部 1. 二手市场是人们将闲置不用的物品集中起来进行交换.交易的场所.在二手市场中买卖二手物品,价格低廉.二手交易市场又称跳蚤市场.   中 ...

  2. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

  3. EF Core 1.0中使用Include的小技巧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...

  4. EF如何操作内存中的数据和加载外键数据:延迟加载、贪婪加载、显示加载

    EF如何操作内存中的数据和加载外键数据:延迟加载.贪婪加载.显示加载 之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需 ...

  5. 16.翻译系列:EF 6 Code -First中使用存储过程【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored ...

  6. EF Core 2.0中如何手动映射数据库的视图为实体

    由于Scaffold-DbContext指令目前还不支持自动映射数据库中的视图为实体,所以当我们想使用EF Core来读取数据库视图数据的时候,我们需要手动去做映射,本文介绍如何在EF Core中手动 ...

  7. EF Core 2.0中Transaction事务会对DbContext底层创建和关闭数据库连接的行为有所影响

    数据库 我们先在SQL Server数据库中建立一个Book表: CREATE TABLE [dbo].[Book]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Cr ...

  8. 不安装谷歌市场,下载谷歌市场中的APK

    不安装谷歌市场,下载谷歌市场中的APK GooglePlayStore 是谷歌官方的的应用市场,有的时候还是需要从谷歌市场下载APK文件.国内的安卓手机厂商都不自带GooglePlay,甚至一些手机& ...

  9. MVC4 EF linq从客户端中检测到有潜在的危险的Request.Path值

    今天做项目的时候遇到了这样的问题贴出来给大家分享下啦, 使用MVC4 EF linq跳转视图的时候出现,从客户端中检测到有潜在的危险的Request.Path值错误,如下图所示: 解决办法如下:  r ...

随机推荐

  1. 题解【洛谷 P1466 [USACO2.2]集合 Subset Sums】

    题目传送门 设 \(sum=1+2+3+4+\dots+n=\dfrac{n(n+1)}{2}\). 如果 \(2\nmid sum\),则显然没有方案. 如果 \(2\mid sum\),则这两个集 ...

  2. YII总结学习7(在一个视图中显示另外一个视图)

    controller\hello <?php namespace app\controllers; use yii\web\Controller; class helloController e ...

  3. 6.22 NOI 模拟

    \(T1\)递归 给出 \(Thue-Morse\) 序列的定义三 每次 \(0\rightarrow 01\),\(1\rightarrow 10\) \(0\rightarrow 01 \righ ...

  4. goalng-sync/atomic原子操作

    目录 1.go已经提供了锁,为什么还需要atomic原子操作? 2.atomic原子操作为什么比mutex快? 3.CAS 4.互斥锁与原子操作区别 5.原子操作方法 5.1 atomic.AddIn ...

  5. MybatisPlus高级特性

    MybatisPlus高级特性 1. 公共字段自动填充 1.1 问题分析 在新增员工时需要设置创建时间.创建人.修改时间.修改人等字段,在编辑员工时需要设置修改时间.修改人等字段.这些字段属于公共字段 ...

  6. nginx的安装和配置

    目录 目录 一.购买下载SSL证书 二.修改Nginx配置信息 三.重启Nginx 一.购买下载SSL证书 SSL证书阿里云做活动期间可以免费申请,购买SSL证书时选择单域名-DV SSL-免费版即可 ...

  7. KingbaseES V8R6 vacuum index_cleanup 选项

    描述: 由于索引页的复用不像HEAP TABLE的PAGE复用机制那么简单只要有空闲空间就可以插入.索引页的空闲空间被复用,必须是PAGE的边界内的值才允许插入. 因此索引一旦膨胀,很难收缩,常用的方 ...

  8. Mysql 实现 向上递归查找父节点并返回树结构

    需求:通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构. 如果只有叶子,剔除掉; 如果只有根,只 ...

  9. day37-IO流04

    JavaIO流04 4.常用的类03 4.4节点流和处理流02 4.4.5对象处理流-ObjectInputStream和ObjectOutputStream 1.序列化和反序列化 例子1: 看一个需 ...

  10. Skype for Business server 数据库安装

    之前安装了SFB 2015标准版,但是没有安装归档据库,现在打算重新安装.环境中安装的是默认自带的SQL EXPRESS. 继续安装向导,安装SQL数据库.但是在最后的时候遇到了问题. 安装向导报错 ...