//1 延迟加载 每次使用子表时再查询
//2 放弃子表查询
//3 Include一次性主从表
//4 放弃子表查询,又去显示获取某个数据
//主流选择会去导航,内置的方便;innor join也能完成
using (JDDbContext context = new JDDbContext())
{
context.Database.Log += c => Console.WriteLine(c);
//实体类型包含其它实体类型(POCO类)的属性(也可称为导航属性),且同时满足如下条件即可实列延迟加载,
//1.该属性的类型必需为public且不能为Sealed;
//2.属性标记为Virtual
context.Configuration.LazyLoadingEnabled = true;//默认是true 针对导航属性的
var companyList = context.Set<Company>().Where(c => c.Id > 0);
foreach (var company in companyList)
{
Console.WriteLine("Company id={0} name={1}", company.Id, company.Name);
foreach (var item in company.Users)//这个时候才去数据库查询user
{
Console.WriteLine("User name={0}", item.Name);
}
}
}
Console.WriteLine("******************************************");
using (JDDbContext context = new JDDbContext())
{
context.Database.Log += c => Console.WriteLine(c);
context.Configuration.LazyLoadingEnabled = false;//不延迟加载,不会再次查询了
var companyList = context.Set<Company>().Where(c => c.Id > 0);
foreach (var company in companyList)
{
Console.WriteLine("Company id={0} name={1}", company.Id, company.Name);
foreach (var item in company.Users)//这个时候才不去数据库查询了,所以用户全是空的了
{
Console.WriteLine("User name={0}", item.Name);
}
}
}
Console.WriteLine("******************************************");
using (JDDbContext context = new JDDbContext())
{
context.Database.Log += c => Console.WriteLine(c);
//context.Configuration.LazyLoadingEnabled = false;//不延迟加载,指定Include,一次性加载出来
var companyList = context.Set<Company>().Include("Users").Where(c => c.Id > 0);
foreach (var company in companyList)
{
Console.WriteLine("Company id={0} name={1}", company.Id, company.Name);
foreach (var item in company.Users)
{
Console.WriteLine("User name={0}", item.Name);
}
}
}
using (JDDbContext context = new JDDbContext())//LoadProperty 手动加载
{
context.Database.Log += c => Console.WriteLine(c);
context.Configuration.LazyLoadingEnabled = false;//不延迟加载,指定Include,一次性加载出来
var companyList = context.Set<Company>().Where(c => c.Id > 0);
foreach (var company in companyList)
{
Console.WriteLine("Company id={0} name={1}", company.Id, company.Name);
context.Entry<Company>(company).Collection(c => c.Users).Load();//集合显示加载
//context.Entry<Company>(company).Reference(c => c.User).Load();//单个属性用
foreach (var item in company.Users)
{
Console.WriteLine("User name={0}", item.Name);
}
}
}
#endregion 导航属性 延迟加载
(事务嵌套)TransactionScope是Window系统支持的DTC 可以支持一个context多次操作
也可以支持多个context,甚至多个数据库(单机/局域网需要配置服务)
//using (TransactionScope trans = new TransactionScope())
//{
// using (JDDbContext context1 = new JDDbContext())
// using (JDDbContext context2 = new JDDbContext())
// {
// context1.Database.Log += c => Console.WriteLine(c);
// context2.Database.Log += c => Console.WriteLine(c);
// Company company1 = new Company()
// {
// Name = "Test1",
// CreateTime = DateTime.Now,
// CreatorId = 1,
// LastModifierId = 0,
// LastModifyTime = DateTime.Now,
// };
// context1.Companies.Add(company1);
// context1.SaveChanges();
// Company company2 = new Company()
// {
// Name = "123",
// CreateTime = DateTime.Now,
// CreatorId = 1,
// LastModifierId = 0,
// LastModifyTime = DateTime.Now,
// };
// context2.Companies.Add(company2);
// context2.SaveChanges();
// trans.Complete();
// }
//}
主从删除
非级联删除
//using (JDDbContext context = new JDDbContext())
// //{
// // context.Database.Log += c => Console.WriteLine(c);
// // Company company = context.Companies.Include("Users").FirstOrDefault(c => c.Id == companyId);
// // List<User> usersList = new List<User>();
// // foreach (var user in company.Users)
// // {
// // usersList.Add(user);
// // //context.Users.Remove(user);//因为直接遍历是不能对其进行修改删除操作
// // }
// // usersList.ForEach(u => context.Users.Remove(u));
// // context.Companies.Remove(company);
// // context.SaveChanges();
// //}
级联删除
//级联删除 就直接删主表,数据库会自动把从表删了,不过提前先去数据库设置好删除规则是级联
// //using (JDDbContext context = new JDDbContext())
// //{
// // context.Database.Log += c => Console.WriteLine(c);
// // Company company = context.Companies.FirstOrDefault(c => c.Id == companyId);
// // context.Companies.Remove(company);
// // context.SaveChanges();
// //}
// //主外键--删除从表数据--增加几条从表数据
再往下的封装就类似于ormlite,分好层次,要有base和interface