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 ...
随机推荐
- 如何使用Log4j
如何使用Log4j? 1. Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta. ...
- zend studio导入外部项目乱码怎么解决
在zendstudio ide中,导入一个工程后,发现工程里面很多的文件都打上了红色的叉叉,打开这些文件一看,发现只要是有汉字存在的文件,都出现了乱码.按住alt+enter发现,该文件的编码默认为g ...
- 2018.12.17 bzoj1406 : [AHOI2007]密码箱(简单数论)
传送门 简单数论暴力题. 题目简述:要求求出所有满足x2≡1mod  nx^2\equiv1 \mod nx2≡1modn且0≤x<n0\ ...
- 牛客训练五:炫酷路途(c++与dp)
题目链接:传送门 思路:每隔2^i(0<=i<=INF)就有一条路径,所以可以将从头到尾的路线视为一个有向图, 将ai,bi以此输入,然后将路径从小到大排序,不断更新路径. __built ...
- Le Chapitre I
Lorsque j'avais six ans j'ai vu, une fois, une magnifique image, dans un livre sur la Forêt[fɔrε] Vi ...
- SHELL脚本之awk妙用
对于一个sougou文本文件,解压后大概4G,要求在其基础上切出第一列时间年月日时分秒增加在列中,作为hive的一个索引.先将文件head一下展示格式: [root@Master date]# hea ...
- hadoop flume 架构及监控的部署
1 Flume架构解释 Flume概念 Flume是一个分布式 ,可靠的,和高可用的,海量的日志聚合系统 支持在系统中定制各类的数据发送方 用于收集数据 提供简单的数据提取能力 并写入到各种接受方 ...
- Java四种排序:冒泡,选择,插入,二分(折半插入)
四种排序:冒泡,选择,插入,二分(折半插入) public class Test{ // public static void main(String[] args) { // Test t=new ...
- 20155205 2016-2017-2 《Java程序设计》第8周学习总结
20155205 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO使用频道来衔接数据节点,可以设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行 ...
- day22(过滤器Filter)
过滤器 生命周期:初始化 -----过滤-------销毁 作用:过滤url ,特定字符 创建方式:实现一个接口继承Filter package com.baidu.filter; import ja ...