ModelFirst的CRUD

创建实体:

创建上下文:

创建一个用户的实体:

UserInfo userInfo = new UserInfo();
            userInfo.UName = "sunliyuan";

 对实体进行添加操作:

dbContext.UserInfo.Add(userInfo);

 添加两个订单:

 OrderInfo order1 = new OrderInfo();
  order1.Content = "shit1";
   dbContext.OrderInfo.Add(order1);

 OrderInfo order2 = new OrderInfo();
      order2.Content = "shit2";
      dbContext.OrderInfo.Add(order2);

 关联三个实体:(用户和订单一对多)

1.通过用户添加订单实体到自己的导航属性

userInfo.OrderInfo.Add(order1);

2.通过订单指定用户的实体:

order2.UserInfo = userInfo;
order2.UserInfoID = userInfo.ID; 

把上面实体的变化封装成sql执行到数据库中:

dbContext.SaveChanges();

 

修改:

UserInfo userInfoEdit =new UserInfo();

 

userInfoEdit.ID = 1;
 userInfoEdit.UName = "Demo" + DateTime.Now;

    dbContext.Entry(userInfoEdit).State = EntityState.Modified;
//修改某个字段 dbContext.Entry(userInfoEdit).Property(u => u.UName).IsModified = true;

 查询:(数据量小的时候使用Include)

IQueryable<UserInfo> temp = from u in dbContext.UserInfo.Include("OrderInfo")
                                      where  u.UName.Contains("o") 
                                      && u.UName.StartsWith("D")
                                       select u;
IQueryable<>==var 注:能连续写where条件 相当于拼结

 

两种延迟加载:

 用到的时候就会去查询数据。把集合缓存起来
            foreach (var userInfo in temp)
            {
              Console.WriteLine(userInfo.ID + "  " +userInfo.UName);
            }

            foreach (var userInfo in temp)
            {
               Console.WriteLine(userInfo.ID + "  " + userInfo.UName);
            }

            var temp2 = from u in temp
                        where u.ID > 0
                        select u;    //会组成一个SQL脚本
            foreach (var userInfo in temp2)
            {
                Console.WriteLine(userInfo.ID + "  " + userInfo.UName);
            } 

 第二种:延迟加载  导航属性  (数据量大时使用延迟加载)

foreach (var userInfo in temp)//100个用户数据。    101:跟后台交互的时间就比 一次连接表查询时间还要长。
           {
               foreach (var orderInfo in userInfo.OrderInfo)
                {
                  Console.WriteLine(userInfo.UName+ "  " +orderInfo.ID + "  " + orderInfo.Content);
                }
            }

 大数据查询的方法:

1.把链接查询分解,转成单个大表的查询。最后在内存中组装数据

2.临时表(解决死锁的问题)

select * into #table from UserInfo
一个#代表临时表
两个## 代表全局临时表

 

 

EF的原理:

这是ModelFirst拿XML打开的文件:

第一个是表的定义。(存储定义语言)  第二个:表实体的描述(概念模型)   第三个:映射关系

根据实体的状态和映射关系生成相应的SQL脚本

 

Lambda表达式可以转换成Expression类型

Lambda语句转换不成Expression类型

Lambda 简单的查询:

 var data = dbContext.UserInfo.Where(u => u.ID > 0);

            foreach (var userInfo in data)
            {
                Console.WriteLine(userInfo.ID + "  " + userInfo.UName);
            }

 Linq和Lambda性能有什么不同?

运行阶段一样   编译阶段有些不同

Linq--》Expression

Lambda---》Expression

 

分页:

  var pagedata = dbcontext.userinfo
                                    .where(u => u.id > 0)
                //.orderby(u=>u.id)//升序
                                    .orderbydescending<UserInfo,int>(u => u.id)
                //一页5条    取 3页
                                    .skip(5 * (3 - 1))
                                    .take(5);

            foreach (var userInfo in pageData)
            {

            }

  查询部分列:

            var demo = (from u in dbContext.UserInfo
                       where u.ID > 0
                       orderby u.ID descending
                       select u).Skip(10).Take(5);

            //Linq表达式
            var data = from u in dbContext.UserInfo
                       select new {MyUName=u.UName,u.ID,OrderCounts= u.OrderInfo.Count};

            //Lambda
            var data =
                dbContext.UserInfo.Where(u => u.ID > 0)
                         .Select(u => new {u.ID, MyUName = u.UName, OrderCounts = u.OrderInfo.Count});


            foreach (var item in data)
            {
                
                Console.WriteLine(item.ID + "  " + item.MyUName + "  " + item.OrderCounts);
            }

 

CodeFirst模式:

public UserInfo()
        {
            OrderInfo =new HashSet<OrderInfo>();
        }

        [Key]
        public int Id { get; set; }

        public string SName { get; set; }

        public int Age { get; set; }

        public string Email { get; set; }

        public virtual ICollection<OrderInfo> OrderInfo { get; set; }
 public class OrderInfo
    {
        [Key]
        public int Id { get; set; }

        public string Content { get; set; }

        public virtual  UserInfo UserInfo { get; set; }
    }
public class CodeFirstDbContext : DbContext
    {

        public CodeFirstDbContext()
            : base("name=DataModelContainer")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //throw new UnintentionalCodeFirstException();
        }

        public DbSet<UserInfo> UserInfo { get; set; }
        public DbSet<OrderInfo> OrderInfo { get; set; }

    }

 数据库配置:

 <connectionStrings>
    <add name="DataModelContainer" connectionString="server=.;uid=sa;pwd=123;database=SunLiYuanCodeFirstDb;" providerName="System.Data.SqlClient"/>
  </connectionStrings>
支持MySql  
<add name="DataModelContainer" connectionString="server=127.0.0.1;
user id=root;password=123;persist security info=True;database=SunLiYuanCodeFirstDb;charset=utf8;" providerName="MySql.Data.MySqlClient" />
  static void Main(string[] args)
        {
            using (CodeFirstDbContext dbContext = new CodeFirstDbContext())
            {
                dbContext.Database.CreateIfNotExists();

                UserInfo userInfo = new UserInfo();
                userInfo.Age = 10;
                userInfo.Email = "ssss";
                userInfo.SName = "ssss";

                dbContext.UserInfo.Add(userInfo);
                dbContext.SaveChanges();
            }
            Console.WriteLine("ok....");

            Console.ReadKey();

        }

 

EF图解:

posted @ 2016-11-20 20:15  石shi  阅读(168)  评论(0编辑  收藏  举报