ef mysql modelfirst_EF--ModelFirst

EF框架有三种基本的方式:DB First,Model First,Code First。这里简单的说一下Model First,适合没有基础的同学照着做,学习基础的东西。

1、建立一个类库项目,这个项目如果是在项目开发中,应该就是DB项目了,负责最底层的与数据库打交道的。

e7586f15fa544c45e9af71ab6f8f9bd1.png

843972415007aadb615ffc79817d867e.png

2、在项目中添加一个实体数据模型,然后选择空模型

a347a246d69930f2137aac4571c7f36d.png

7a3527d3b06d8e8b692e02a0ea51ea7c.png

3、在edmx文件中添加新实体。在这里,实体名称是项目中的类名;基类型是当前实体的父类,没有就不选择;实体集是这个实体在数据库中的表名;键属性是表的键,这里只支持

单一键

137bbf40edb403e3a6700ec61ee27405.png

添加如下3个实体。

e40d6a1472fc67ab04fa20aa14af03e2.png

这3个实体是相互之间有关系的,right和user是多对多的关系,user和role是多对一的关系,因此需要将它们关联起来

b87cd388c79a0bce7c5c7010f91797de.png

5e48b20a067980bea5ace4fce380a094.png

e12bd8b924bd86b74565a0e2c44ff371.png

9e2bf0e74ca575732b90a07cfedf9233.png

在添加关联后,导航属性是自动添加的

4、根据模型生成数据库表,由于model first只负责添加新表,不会创建数据库,因此,需要先在sqlserver中建立数据库。在这里为了简单,就使用了sql系统的默认数据库model

b8fadb86210571ef85c0539ff96c7b0c.png

656ce27c050c52bbab506ef8955404af.png

293768888d117ff8d88de244bd83eaa9.png

2630b5c1642094360356e4cb3d97a02b.png

c7a21112ddfdbc039012fb96a4cbc477.png

7b645f9ec29257176ca483f823e0fb1b.png

点击完成后,会创建一个sql文件,内容就是创建3个实体的表和相关键值的sql语句

b24525f539f50b7ecc4c55552e50025d.png

3f5521bfb4e274a211088136a319526b.png

5、执行这个sql文件

82c28a30f5d5456d6896d730f6b26543.png

7d878bfe876e913325d95d1a37919c48.png

320873900e9fee7eba012c7a495dfc2e.png

点击connect后,系统自动会在sqlserver中创建相应的表。这个时候,需要去保存edmx文件,然后系统会自动在EfModelContainer类中添加相应的实体表的属性,并且创建相应

的实体类

0499761e9fe26a0975b555b07b2b500f.png

0bdb0e4eba791cbb9512ad617bfd7c7b.png

6、在数据库中可以看到,系统自动添加了一个rightuser的关系表,这是因为这两个实体是多对多的关系,所以创建了这样一个关系表。同时,在user类中,自动

添加了两个virtual修饰的字段,它们都是user实体的导航属性。至此,从模型到数据库的创建就完成了。

7、下面来看看在modelfirst模式下,对数据库的增删改查

在类class1中添加如下代码 。这里只是简单的介绍,如果是在项目开发中,这些增删改查的代码一般不会放在这个项目中。

public classClass1

{//实例化数据库上下文 这个EfModelContainer是系统自动生成的局部类

EfModelContainer dbcontext = null;publicClass1()

{//实例化数据库上下文

dbcontext = newEfModelContainer();

}public IListgetRoleSet()

{//使用Lambda表达式查询数据

IList RoleList = dbcontext.RoleSet.Where(o => o.Name != "").ToList();returnRoleList;

}public intAddRoleSet(Role r)

{try{

dbcontext.RoleSet.Add(r);

dbcontext.SaveChanges();//对数据库的修改一定要添加这条语句

}catch(Exception e)

{return 0;

}return 1;

}public intModifyRoleSet(Role r)

{

IList rlist = dbcontext.RoleSet.Where(o => o.Id ==r.Id).ToList();

Role rn= rlist.ElementAtOrDefault(0);if (null !=rn)

{

rn=r;returndbcontext.SaveChanges();

}return 0;

}public boolDelRoleSet(Role r)

{try{

dbcontext.RoleSet.Remove(r);

dbcontext.SaveChanges();

}catch(Exception e)

{return false;

}return true;

}

}

8、创建一个控制台项目,添加modelfirst项目的引用。从modelfirst项目中将数据库字符串复制了放到控制台项目的配置文件中。这个字符串也是系统自动生成的,直接复制就行

static void Main(string[] args)

{

Class1 c= newClass1();

Role rnew= new Role() { Id = Guid.NewGuid(), Name = "科长"};if (c.AddRoleSet(rnew) == 1)

Console.WriteLine("数据添加成功。id:" + rnew.Id + ";name:" +rnew.Name);elseConsole.WriteLine("数据添加失败");

rnew.Name= "副科长";if (c.ModifyRoleSet(rnew) == 1)

Console.WriteLine("数据修改成功。id:" + rnew.Id + ";name:" +rnew.Name);elseConsole.WriteLine("数据修改失败");//使用Lambda表达式查询数据

IList RoleList =c.getRoleSet();//打印查询结果

if(RoleList.Any())

{foreach (Role r inRoleList)

{

Console.WriteLine(r.Name+ "----" +r.Id);

}

}//if( c.DelRoleSet(rnew))//Console.WriteLine("数据删除成功。");//else//Console.WriteLine("数据删除失败");

Console.Read();

}

执行结果

30f67106f3e3a9c7a73cdd3b1b3ebc21.png

9、现在数据库中有数据了,这个时候,如果需要添加新的表,或者对已有的表重新设计,需要特别的注意。

首先是要在edmx中添加相应的实体或者修改,弄完之后,右键菜单--》根据模型生成数据库,这个时候会重新生成新的sql文件来覆盖原来的。但是这个sql文件是要将原来的表

以及表的关系全部删除了,然后重新建立表,这样一来数据库中的数据就全没了,所以在这里千万不能去执行这个sql文件,如果非要执行,那必须先删除不需要的sql语句,保留

自己修改的那部分才能执行。另外就是自己手动到sqlserver中去做修改了。

在modelfirst模式下,如果要添加新表,必须先在模型中添加相应的实体,并且根据模型生成数据库后,还要在数据库中去添加表。如果是在项目开发中,这种对数据库结构有修改

的操作最好是由专人负责。

10、在user类中,通过关联关系,使得类中多了两个比较特殊的属性。属性role,类型是Role,在这里显的有点大材小用了,从数据库表中看,这个role本该表示roleid 的。在查询

user表中数据的时候,系统会自动的将属性role的所有信息都查出来放在属性role中,这在某些时候会导致user类的对象太大了,当然有些时候又是很方便的,这个就需要具体的分析

了。避免这样的情况就是不要去添加关联,直接在实体user中添加标量属性roleid就是了,当然设置外键可以在建好表之后再处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值