EF--ModelFirst

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

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

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

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

单一键

添加如下3个实体。

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

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

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

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

5、执行这个sql文件

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

的实体类

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

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

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

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

 public class Class1
    {
        //实例化数据库上下文 这个EfModelContainer是系统自动生成的局部类
        EfModelContainer dbcontext = null;
        public Class1()
        {
            //实例化数据库上下文
            dbcontext = new EfModelContainer();
        }
        public IList<Role> getRoleSet()
        {
            //使用Lambda表达式查询数据
            IList<Role> RoleList = dbcontext.RoleSet.Where(o => o.Name != "").ToList();
            return RoleList;
        }

        public int AddRoleSet(Role r)
        {
            try
            {
                dbcontext.RoleSet.Add(r);
                dbcontext.SaveChanges();//对数据库的修改一定要添加这条语句
            }
            catch (Exception e)
            {
                return 0;
            }
            return 1;
        }

        public int ModifyRoleSet(Role r)
        {
            IList<Role> rlist = dbcontext.RoleSet.Where(o => o.Id == r.Id).ToList();
            Role rn = rlist.ElementAtOrDefault(0);
            if (null != rn)
            {
                rn = r;
                return dbcontext.SaveChanges();
            }
            return 0;
        }
        public bool DelRoleSet(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 = new Class1();

            Role rnew = new Role() { Id = Guid.NewGuid(), Name = "科长" };
            if (c.AddRoleSet(rnew) == 1)
                Console.WriteLine("数据添加成功。id:" + rnew.Id + ";name:" + rnew.Name);
            else
                Console.WriteLine("数据添加失败");

            rnew.Name = "副科长";

            if (c.ModifyRoleSet(rnew) == 1)
                Console.WriteLine("数据修改成功。id:" + rnew.Id + ";name:" + rnew.Name);
            else
                Console.WriteLine("数据修改失败");
            //使用Lambda表达式查询数据
            IList<Role> RoleList = c.getRoleSet();
            //打印查询结果  
            if (RoleList.Any())
            {
                foreach (Role r in RoleList)
                {
                    Console.WriteLine(r.Name + "----" + r.Id);
                }
            }

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

执行结果

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/jin-/p/6589307.html