Lerning Entity Framework 6 ------ Inserting, Querying, Updating, and Deleting Data
Creating Entities
First of all, Let's create some entities to have a test.
- Create a project
- Add following packages by NuGet
- EntityFramework
- MySql.Data.Entity (I'm just using MySql, it's not necessary)
Add some codes:
class Class
{
public int ClassId { get; set; } [MaxLength(50)]
public string ClassName { get; set; } public virtual ICollection<Student> Students { get; set; }
} class Student
{
public int StudentId { get; set; } [MaxLength(50)]
public string StudentName { get; set; } public int Age { get; set; } public virtual Class Class { get; set; } public virtual ICollection<Course> Courses { get; set; } public virtual ICollection<Phone> Phones { get; set; }
} class Phone
{
public int phoneId { get; set; } [MaxLength(20)]
public string PhoneNumber { get; set; }
} class Course
{
public int CourseId { get; set; } [MaxLength(50)]
public string CourseName { get; set; } public virtual ICollection<Student> Students { get; set; }
} class MyContext:DbContext
{
public MyContext():base("name=Test")
{ } public DbSet<Class> Classes { get; set; } public DbSet<Student> Students { get; set; } public DbSet<Course> Courses { get; set; }
}
Then, Execute following commands in NuGet command line
- Enalbe-Migrations
- Add-Migration init
- Update-Database
Inserting
Add some codes in main function:
static void Main(string[] args)
{
Class class1 = new Class { ClassName = "Class One", };
Course course1 = new Course { CourseName = "English", };
Course course2 = new Course { CourseName = "Chinese", };
Student s1 = new Student
{
Age = 18,
Class = class1,
Courses = new List<Course> { course1, course2 },
Phones = new List<Phone> {
new Phone { PhoneNumber = "13718431702"},
new Phone { PhoneNumber = "13733423722" } },
StudentName = "Joye"
};
Student s2 = new Student
{
Age = 19,
Class = class1,
Courses = new List<Course> { course1 },
Phones = new List<Phone> {
new Phone { PhoneNumber = "13708431702"},
new Phone { PhoneNumber = "13783423722" } },
StudentName = "Ross"
};
Student s3 = new Student
{
Age = 17,
Class = class1,
Courses = new List<Course> { course2 },
Phones = new List<Phone> { new Phone { PhoneNumber = "13708431702" } },
StudentName = "Monnica"
};
using (MyContext db = new MyContext())
{
db.Students.Add(s1);
db.Students.Add(s2);
db.Students.Add(s3);
db.SaveChanges();
}
}
I've created one class, two courses, three students and five phone numbers. Then, I add the three studengs to the Studengs DbSet and called the SaveChanges function. That all I did. Maybe you will say: Why don't we need to add all of the entities to the Dbset. When Entity Framework saves a entity, it also saves the whole object graph. How cool it is.
Querying
Filtering data in queries
using (MyContext db = new MyContext())
{
var students = db.Students.Where(s => s.Age > 17);
foreach (var item in students)
{
Console.WriteLine(item.StudentName + " " + item.Age);
}
}
Console.Read();
You can do this by LINQ too.
Sorting data in queries
using (MyContext db = new MyContext())
{
var students = db.Students
.OrderBy(s => s.Age)
.ThenBy(s => s.StudentName);
foreach (var item in students)
{
Console.WriteLine(item.StudentName + " " + item.Age);
}
}
Console.Read();
Working with related entities
static void Main(string[] args)
{
using (MyContext db = new MyContext())
{
var students = from s in db.Students
where s.Courses.Any(c => c.CourseName == "Chinese")
select s;
foreach (var item in students)
{
Console.WriteLine(item.StudentName + " " + item.Age);
}
}
Console.Read();
}
Loading Related Entities
there are three ways of loading related entities:
Lazy Loading
This way is the default way of Entity Framework 6. Lazy loading is the process whereby an entity or collection of entities is automatically loaded from the database the first time that a property referring to the entity/entities is accessed.(MSND) There are two rules you must pay attention to:
- The model must be defined as public
- the navigation property must be defined as virtual
For example:
using (MyContext db = new MyContext())
{
Student oneStudent = db.Students.Find(1); //query the database for the first time
foreach (var item in oneStudent.Phones) //query the database for the second time
{
Console.WriteLine(item.PhoneNumber);
}
}
You can turn lazy loading off by two ways:
- Remove the public key of model or remove the virtual key of navigation property
- Set the Configuration.LazyLoadingEnabled property of DbContext flase
Eagerly Loading
Eager loading is the process whereby a query for one type of entity also loads related entities as part of the query. Eager loading is achieved by use of the Include method.(MSND) For example:
using (MyContext db = new MyContext())
{
db.Configuration.LazyLoadingEnabled = false;
var students = from s in db.Students.Include(s => s.Phones)
where s.StudentName == "Joye"
select s;
foreach (var s in students)
{
foreach (var p in s.Phones)
{
Console.WriteLine(p.PhoneNumber);
}
}
}
using (MyContext db = new MyContext())
{
db.Configuration.LazyLoadingEnabled = false;
var courses = from c in db.Courses.Include(cc => cc.Students.Select(s => s.Phones))
where c.CourseName == "English"
select c;
Console.WriteLine(courses.First().Students.First().Phones.First().PhoneNumber);
}
Explicitly Loading
Even with lazy loading disabled it is still possible to lazily load related entities, but it must be done with an explicit call. To do so you use the Load method on the related entity’s entry.(MSND) For example:
using (MyContext db = new MyContext())
{
db.Configuration.LazyLoadingEnabled = false;
Course c = db.Courses.Find(1);
db.Entry(c)
.Collection(cc => cc.Students)
.Load();
Console.WriteLine(c.Students.Count);
}
If the navigation property is a single entity, please use Reference method. If the navigation property is a collection of entities, please use method Collection.
Updating
using (MyContext db = new MyContext())
{
var sutdent = db.Students.Find(1);
sutdent.StudentName = "Joey";
db.SaveChanges();
}
Or:
using (MyContext db = new MyContext())
{
var sutdent = new Student
{
StudentId = 1,
StudentName = "Joeyy"
};
db.Entry(sutdent).State = EntityState.Modified;
db.SaveChanges();
}
Deleting
using (MyContext db = new MyContext())
{
var student = db.Students.Find(1);
var course = db.Courses.Find(1);
course.Students.Remove(student);
db.SaveChanges();
}
After you run the codes, one of the rows of table coursestudents is deleted. If you remove a entity from db.Students, one of the rows of table people will be deleted.
You can also use entry method:
using (MyContext db = new MyContext())
{
var phone = new Phone { phoneId = 1 };
db.Entry(phone).State = EntityState.Deleted;
db.SaveChanges();
}
That's all.
Lerning Entity Framework 6 ------ Inserting, Querying, Updating, and Deleting Data的更多相关文章
- Lerning Entity Framework 6 ------ Defining Relationships
There are three types of relationships in database. They are: One-to-Many One-to-One Many-to-Many Th ...
- MySQL Crash Course #11# Chapter 20. Updating and Deleting Data
INDEX Updating Data The IGNORE Keyword Deleting Data Faster Deletes Guidelines for Updating and Dele ...
- Lerning Entity Framework 6 ------ Handling concurrency With SQL Server Database
The default Way to handle concurrency of Entity Framework is using optimistic concurrency. When two ...
- Lerning Entity Framework 6 ------ Working with in-memory data
Sometimes, you need to find some data in an existing context instead of the database. By befault, En ...
- Lerning Entity Framework 6 ------ Defining the Database Structure
There are three ways to define the database structure by Entity Framework API. They are: Attributes ...
- Lerning Entity Framework 6 ------ Introduction to TPH
Sometimes, you have created two models. They have the same parent class like this: public class Pers ...
- Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常
错误信息: “System.Data.Entity.Core.EntityCommandExecutionException”类型的异常在 EntityFramework.SqlServer.dll ...
- Lerning Entity Framework 6 ------ Complex types
Complex types are classes that map to a subset of columns of a table.They don't contains key. They a ...
- Lerning Entity Framework 6 ------ Using a commandInterceptor
Sometimes, We want to check the original sql statements. creating a commandInterceptor is a good way ...
随机推荐
- Tomcat优化详细1
在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整.由于Tomcat的运行依赖于J ...
- [VBS]检测计算机各硬件信息
1)批处理脚本:Rhea_HardwareInfoCollector.bat 调用VBScript脚本Rhea_HardwareInfoCollector.vbs,并将结果打印到文件Rhea_Resu ...
- C# 使用 HttpPost 请求调用 WebService
之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用 ...
- Django之admin管理数据库,cookie验证及分页设置
一.admin管理数据库 1)models.py创建class类表 class Book(models.Model): name=models.CharField(max_length=) price ...
- Django的学习(四)———— admin
admin是django自带的一个管理者,由于自带所以直接对admin文件进行一个配置. 一.创建用户: python manage.py createsuperuser 创建合理的用户信息就可以在网 ...
- 2018.12.17 bzoj4802: 欧拉函数(Pollard-rho)
传送门 Pollard−rhoPollard-rhoPollard−rho模板题. 题意简述:求ϕ(n),n≤1e18\phi(n),n\le 1e18ϕ(n),n≤1e18 先把nnn用Pollar ...
- 2018.12.12 codeforces 931E. Game with String(概率dp)
传送门 感觉这题难点在读懂题. 题目简述:给你一个字符串s,设将其向左平移k个单位之后的字符串为t,现在告诉你t的第一个字符,然后你可以另外得知t的任意一个字符,求用最优策略猜对k的概率. 解析: 预 ...
- 2018.10.27 洛谷P2915奶牛混合起来Mixed Up Cows(状压dp)
传送门 状压dp入门题. 按照题意建一个图. 要求的就是合法的链的总数. 直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数. 然后从没被选并且跟iii ...
- Java潜在的坑持续总结
1.Java里如果有if (foo == 0),如果foo是null这里居然是会抛NPE异常而不是返回false: 2.Java里整形数值不能用==来比较,因为只有区间是[-128,127]的才能这么 ...
- WordPaster-KesionCMS V9整合教程
注意:KesionCMS V9使用的是JQuery 1.10.3版本.需要到JQuery UI官网下载JQuery 1.10.3的UI库. JQueryUI官网:http://jqueryui.com ...