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 不是同一個類,這樣可直接批量添加