前面博客也讲了,自己做一个网站,选用的是MVC+EF Code First+MySql+EasyUI,先说下技术选型。
一、为什么选择MVC?

因为之前自己做的系统大部分是webForm,MVC的之前也做过但是也都是框架已经搭好的,所以选择使用MVC框架,自己也搭建下MVC类型的框架。MVC也比webForm也更加方便容易开发。

二、为什么选择EF Code First呢?

这个说起来惭愧,C#不用Code First也是可以访问Mysql数据库的,只要下载C#访问MySQL数据库的ADO.NET驱动程序 mysql-connector-net(http://www.mysql.com)、引入Mysql.Data.dll类库,然后使用Mysqlhelper来访问数据库,这样的也是要先设计数据库,然后访问数据库,从数据库查询数据,但是这种也是有弊端,我刚开始的时候就是想用这种方式,当我遇到要分页的时候我就傻眼了,使用sql分页也是特别麻烦。所以就选择了CodeFirst,这样更加方便。

三、为什么使用Mysql呢?

这个不是我能做主的,华为那边的客户给的就是一个mysql的数据库,哎,不过想想自己在使用mysql的过程中也学到好多东西。

四、为什么选择EasyUI?

之前也用过类似的前端框架,像ligerui,但easyui之前没用过,所以想着自己用着试试,所以就选择了EasyUI。

五、在搭建框架中遇到的问题?

1.Code First操作MySQL数据库

今天就是主要解决了这个问题,公司不能访问外网,不能使用Negut来管理dll。所以还是我自己在家里把EntityFramework.6.1.3、MySql.Data.6.9.9、MySql.Data.Entity.6.9.9下载发到公司邮箱中。如果没安装就会出现下面的错误.

安装之后可不是万事大吉了,坑是一个接着一个,连接数据库的时候又会出现下面的错误。

这个错误需要在数据库中执行下面的一句sql

set global optimizer_switch='derived_merge=OFF';

还需要修改配置文件数据库上下文放在了Model层,数据库上下文的ConnectionString虽然是在Model层,但还是应该将连接字符串放在Web层的webConfig中。然后要修改配置文件如下:注意版本号

<?xml version="1.0" encoding="utf-8"?>
<!--注意:此项目为动态库,所以此配置文件内容仅供作为范本使用,实际的WPF或ASP.NET项目可从此文件复制配置内容进行修改-->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <!--MySQL启用下面一行-->
  <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
  <!--SQL SERVER 启用下面一行-->
  <!--entityFramework-->
    <contexts>
      <!--通过设置disableDatabaseInitialization="true",可以禁止数据库初始化操作-->
      <context type="EF6CodeFirstMySQL.Model.DataModelContext,EF6CodeFirstMySQL.Model" disableDatabaseInitialization="false">
        <databaseInitializer type="EF6CodeFirstMySQL.Model.DataModelInitializer,EF6CodeFirstMySQL.Model"></databaseInitializer>
      </context>
    </contexts>
    <!--MySQL启用下面一段配置项-->
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <!--SQL SERVER 启用下面一行-->
    <!--defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /-->
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <connectionStrings>
    <!--MySQL启用下面一行-->
    <add name="DataModelContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=EF6CodeFirstDemo;user id=root;password=123456;" providerName="MySql.Data.MySqlClient" />
    <!--SQL SERVER 启用下面一行,注意数据库文件路径中使用了|DataDirectory|宏变量,该变量只在ASP.NET项目中有效-->
    <!--add name="DataModelContext" connectionString="Data Source=.;database=EF6CodeFirstDemo;uid=sa;pwd=123456;AttachDBFilename=|DataDirectory|\XantFlowDB.mdf;" providerName="System.Data.SqlClient"/-->
  </connectionStrings>
 
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
</configuration>

2.EasyUI分页的问题?

前面也讲了为什么选择EF Code First来操作Mysql,分页就是其中的一个原因。因为如果使用之前通过sql访问那还有写通用分页sql,找到总行数和对应页的数据。但是有了code First后,就不用那么麻烦,直接使用Take()和Skip()来分页。这里主要说下分页的思路。在EasyUI中的DataGrid中可以设置分页属性来控制是否分页,如果分页,在easyui请求后天数据时会自动带上页码和每页的数量,这个要注意的是页码是从1开始的,而take()、skip()是从0开始的。然后返回count、row即可分页,所以选择了EF来操作mysql。

参考:http://www.cnblogs.com/joeymary/p/5634262.html

3.EF Code First多对多的查询问题,这个问题算是属于自己没把Linq知识学的透彻导致的。

项目中有实体关系是多对多的关系,由于采用code First,数据库会自动生成一个中间表来映射多对多的关系,但在实体类中这个关系并没体现,只是在每个类中添加了对方的List类型的属性。例如User、Role,一个User可以有多个Role,而一个Role又可以拥有多个User。

    class User
{
[Key]
public int Id { get; set; } public string UserName { get; set; } public List<Role> Roles { get; set; }
}
    class Role
{
[Key]
public int Id { get; set; } public string RoleName { get; set; } public List<User> Users { get; set; }
}

由于想着按照数据库的那套思想连接查询,但是连接查询的时候就出现问题了,两个表怎么连接呢?在linq join 后的on怎么写呢?所以就傻眼了,害我在项目中吭哧吭哧的还写了视图使用code first执行sql来执行视图来解决,这几天也一直在想这个问题,之前一直搜Code First多对多查询,都没我想要的结果,突然就要躺下的时候突然想到这不是Code First的问题,因为即使没有Code First也有多对多,Code First只是提供数据的一种方式,所以这他妈原来是Linq的问题,搜索Linq多对多查询,正好看到http://blog.sina.com.cn/s/blog_4a1489560100ctez.html这一贴子,看到之后才发现是自己傻逼了,这不是From子句吗,这主要还是自己玩Linq还玩的不好,看来有必要继续学习的Linq。

            User userA = new User() { UserName="UserA"};
User userB = new User() { UserName = "UserB" };
Role RoleA = new Role() { RoleName="RoleA"};
Role RoleB = new Role() { RoleName = "RoleB" }; using (var db = new MyContext())
{
userA.Roles = new List<Role>() { RoleA, RoleB };
userB.Roles = new List<Role>() { RoleB };
db.Users.AddRange(new List<User> { userA, userB });
db.SaveChanges();
var data = (from p in db.Users
from s in p.Roles
select new RoleUser { UserName= p.UserName, RoleName=s.RoleName }).ToList(); }

4.现在匿名对像View显示的问题

上面的代码可以看到通过from子句查询多对多的关系,select出RoleUser对象,这个对象是ViewModel,我之前想着用匿名对象返回给View,但是在View中foreach遍历时并不能取到对应的值,所以这边又声明了一个ViewModel。

Code First操作Mysql数据库的更多相关文章

  1. VS Code First使用Mysql数据库详解

    最近电脑出毛病了,自己装显卡驱动给装死了开不了机,自己研究了两天也没解决,只有去修电脑的找专业人员,说起来惭愧,虽然自己是搞计算机的可电脑自己重装系统都还搞不定.重装系统又清理灰尘花了50大洋,现在用 ...

  2. python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

    内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...

  3. Golang原生sql操作Mysql数据库增删改查

    Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...

  4. python操作MySQL数据库报错问题解决

    编写好Python操作数据库的脚本后,运行报错如下: 报错1:“AttributeError: 'NoneType' object has no attribute 'encoding'” 解决办法: ...

  5. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  6. PHP操作MySQL数据库5个步骤

    PHP操作MySQL数据库一般可分为5个步骤:1.连接MySQL数据库服务器:2.选择数据库:3.执行SQL语句:4.关闭结果集:5断开与MySQL数据库服务器连接. 1.用mysql_connect ...

  7. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  8. 转 用C API 操作MySQL数据库

    用C API 操作MySQL数据库 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数,并在下一节详细介绍了它们.请参见25.2.3节,“C API函数描述”. 函数 描述 mysql_a ...

  9. PHP操作mysql数据库:[2]查询数据听语音

    本文主要详细讲解如何使用php语言,对mysql数据库进行查询.添加.删除.更新等操作. 工具/原料   Macromedia Dreamweaver 8 mysql数据库,php语言 一.前言   ...

随机推荐

  1. 使用 xtrabackup 进行MySQL数据库物理备份

    0. xtrabackup的功能 能实现的功能: 非阻塞备份innodb等事务引擎数据库. 备份myisam表会阻塞(需要锁). 支持全备.增量备份.压缩备份. 快速增量备份(xtradb,原理类似于 ...

  2. df,du,mount

    df 查看当前系统中文件系统的使用情况 $df [-aTh]缺省选项查看当前系统的所有文件系统 -a列出所有的信息 -T列出文件系统类型 -hhuman-readable,用合适的单位表示大小 $df ...

  3. mongo日志切割脚本

    两种mongo日志切割脚本 vim /etc/logrotate.d/mongodb /home/mongodb/mongolog/mongod.log { daily rotate 7 compre ...

  4. /proc/interrupts 统计2.6.38.8与3.10.25差异

    eth4进,eth5出 linux-3.10.25 67:          2          3          2          3   PCI-MSI-edge     eth468: ...

  5. background-position控制背景位置

    提示:需要把 background-attachment 属性设置为 "fixed",才能保证该属性在 Firefox 和 Opera 中正常工作.

  6. 当手机被PS掉,人们看到的是手中的灵魂

    Eric Pickersgill是一名摄影师,最近喜欢拍摄并记录人们使用智能手机的情景,不过不同的是,在最终作品中会将手机从人们手中PS掉,一刹那会进入一个奇怪的世界.黑白照片也极具冲击力. 每个人神 ...

  7. 父元素与子元素之间的margin-top问题

    父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. html代码: <div c ...

  8. 如何在Kali Linux下编译Windows Exploit

    前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...

  9. Android RecyclerView 动画展开item显示详情

    stackoverflow上看到这个问题,答主给了个demo http://stackoverflow.com/questions/27446051/recyclerview-animate-item ...

  10. C# 内存信息

      Process proc = Process.GetCurrentProcess();                 Console.Write("专用工作集内存:");   ...