EF Core Add方式

  • Add<TEntity>(TEntity entity)
  • AddRange<TEntity>(IEnumerable<TEntity> entities)
  • AddRange<TEntity>(params TEntity[] entities)

上面三種是add的方式,但是我們平常使用過程中會把<TEntity>去掉,這是因爲編譯器能直接推測出我們泛型的類型。

微軟這裏文檔有介紹,編譯器推測泛型類型

Add

public void add()
        {
        

            User u = new User();
            u.DefaultCurrencyCode = "USD";
            u.FirstName = "zhang";
            u.LastName = "feng";
            u.SecurityLevel = 1;
            Order or = new Order();
            or.Address = "shanghai";
            or.City = "shanghai";
            or.Country = "SH";
            or.Customer = "ME";
            or.OrderDate = DateTime.Now;
            u.Orders = new List<Order>();
            u.Orders.Add(or);
            testDbContext.User.Add(u);
            EntityState ss = testDbContext.Entry(u).State;
            EntityState oror = testDbContext.Entry(or).State;
            testDbContext.SaveChanges();
        }

上述代碼中監控了User和Order 的起始狀態都爲Detached,當程序運行到Add方法後,track的狀態變爲Added,所以Add 方法會將主實體變成added狀態,同時也會將關聯實體類也變成added狀態

INSERT INTO [User] ([DefaultCurrencyCode], [FirstName], [LastName], [SecurityLevel])
 VALUES (@p0, @p1, @p2, @p3);
 SELECT [UserId]
 FROM [User]
 WHERE @@ROWCOUNT = 1 AND [UserId] = scope_identity();
 
 Executed DbCommand (70ms) [Parameters=[@p4='?' (Size = 4000), @p5='?' (Size = 4000), @p6='?' (Size = 4000), @p7='?' (Size = 4000), @p8='?' (DbType = DateTime2), @p9='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
 SET NOCOUNT ON;
 INSERT INTO [Order] ([Address], [City], [Country], [Customer], [OrderDate], [UserId])
 VALUES (@p4, @p5, @p6, @p7, @p8, @p9);
 SELECT [OrderId], [Timestamp]
 FROM [Order]
 WHERE @@ROWCOUNT = 1 AND [OrderId] = scope_identity();

批量添加AddRange<TEntity>(IEnumerable<TEntity> entities)

 public void addRange()
        {
            List<User> userList = new List<User>();
            User u = new User();
            u.DefaultCurrencyCode = "USD";
            u.FirstName = "test";
            u.LastName = "test";
            u.SecurityLevel = 1;
            Order or = new Order();
            or.Address = "shanghai";
            or.City = "shanghai";
            or.Country = "SH";
            or.Customer = "ME";
            or.OrderDate = DateTime.Now;
            u.Orders = new List<Order>();
            u.Orders.Add(or);

            User u1 = new User();
            u1.DefaultCurrencyCode = "USD";
            u1.FirstName = "test";
            u1.LastName = "test";
            u1.SecurityLevel = 1;
            Order or1 = new Order();
            or1.Address = "shanghai";
            or1.City = "shanghai";
            or1.Country = "SH";
            or1.Customer = "ME";
            or1.OrderDate = DateTime.Now;
            u1.Orders = new List<Order>();
            u1.Orders.Add(or1);
            userList.Add(u);
            userList.Add(u);
            userList.Add(u1);
            testDbContext.User.AddRange(userList);
            EntityState ss = testDbContext.Entry(u).State;
            EntityState us = testDbContext.Entry(u1).State;
            testDbContext.SaveChanges();
        }

代碼中我們userList add了3次,其中2個實體類的對象是一樣的,另外一個不同,結果是批量加入了2條數據,而不是3條,因爲

在DbContext上調用SaveChanges方法時,所有EntityState爲Added的實體都將插入數據庫中,而兩個相同的實體類其實在對於u來說,在內存上只存在一個,所以只會添加一條,批量添加的sql是多條sql組成的,就是說,有幾條記錄就生成幾條sql,在性能上可能會有些問題。

批量添加 AddRange<TEntity>(params TEntity[] entities)

這種方式的代碼如下:

 public void addRangeP()
        {
          
            User u = new User();
            u.DefaultCurrencyCode = "USD";
            u.FirstName = "test";
            u.LastName = "test";
            u.SecurityLevel = 1;
            Order or = new Order();
            or.Address = "shanghai";
            or.City = "shanghai";
            or.Country = "SH";
            or.Customer = "ME";
            or.OrderDate = DateTime.Now;
            u.Orders = new List<Order>();
            u.Orders.Add(or);

            User u1 = new User();
            u1.DefaultCurrencyCode = "USD";
            u1.FirstName = "test";
            u1.LastName = "test";
            u1.SecurityLevel = 1;
            Order or1 = new Order();
            or1.Address = "shanghai";
            or1.City = "shanghai";
            or1.Country = "SH";
            or1.Customer = "ME";
            or1.OrderDate = DateTime.Now;
            u1.Orders = new List<Order>();
            u1.Orders.Add(or1);
         
            testDbContext.User.AddRange(u,u,u1);
            EntityState ss = testDbContext.Entry(u).State;
            EntityState us = testDbContext.Entry(u1).State;
            testDbContext.SaveChanges();
        }

這裏也是隻add成功2條,原理與上面一樣,這種參數的方式能夠更加靈活的批量添加,生成的sql也與上面的一樣,性能一般

 

通過DbContext直接調用Add或者Addrange方法也可以達到相同的效果,只是在批量添加的時候可以同時添加不同的類

 testDbContext.AddRange(user,order);//user和order 不是同一個類,這樣可直接批量添加

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章