伊人博客 一款有技术又有生活的博客

ORM--Entity Framework 学习(01)

发布时间:2017-04-23 10:01:19 标签:EF学习 | 阅读(1947)

Entity Framework:微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。

EF有三种使用场景:

1.从数据库生成Class,即DB First。

2.由实体类生成数据库表结构,即Code First,

3.通过数据库可视化设计器设计数据库,同时生成实体类,即Model First。

简单使用:

定义表

    public class Assignment

    {

        public int ID { get; set; }

        public int CourseID { get; set; }

        public int InstructorID { get; set; }

        public int Year { get; set; }

        //Navigation Property,表关系

        public Semester Semester { get; set; }

        public Instructor Instructor { get; set; }

        public Course Course { get; set; }

        public ICollection<ScoreList> ScoreLists { get; set; }

        public ICollection<ForumPost> ForumPosts { get; set; }

        public ICollection<Homework> Homeworks { get; set; }

    }

不用写额外的Annotation,ID字段自动成为主键,CourseID, InstructorID自动成为外键,值类型自动not null,空行下面的那些,EF里面叫Navigation Property,不是数据表的一部分,是多表join之后方便你直接访问join之后的部分的,表示了Entity之间的对应关系。

定义数据库上下文(这里是简单版的)

    public class MyDataContext : DbContext

    {

        public MyDataContext(DbContextOptions<MyDataContext> options)

            : base(options)

        { }

        public DbSet<Assignment> Assignments { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<Assignment>();

        }

    }

EF会自动替你分析表和表之间关系,一对多,多对多,多对一,都给你自动做好,然后级联删除也会自动给你做好,假如出现了环状的级联删除路径,你也可以手动指定级联删除的行为:

modelBuilder.Entity<Enrollment>()

    .HasOne(e=>e.Student)

    .WithMany(e=>e.Enrollments)

    .OnDelete(DeleteBehavior.Restrict);

上面啥意思呢:一个Enrollment对应一个Student,同时一个Student对应多个Enrollments,手动建立的一对多关系,然后指定OnDelete啥都不干。

增:

_context.Enrollments.Add(new Models.Enrollment {

    StudentID = id,

    AssignmentID = assignmentID

});

_context.SaveChanges();

删:

_context.Enrollments.Remove(xxxxx);

_context.SaveChanges();

查:

查分三步:

1.瞬间多表join完成

var joinedTable = _context.Applications

    .Include(a => a.Student)

    .Include(a => a.Assignment)

        .ThenInclude(a => a.Course)

    .Include(a => a.Enrollment)

        .ThenInclude(a => a.Assignment)

            .ThenInclude(a => a.Course);

Include就是A join B,ThenInclude就是A join B join C

2.瞬间用linq完成查询

    joinedTable.Where(e=>e.ID == id).OrderByDescending(e=>e.Time)

3.瞬间用匿名结构把东西送出去

var r = new

{

    CourseName = data.Course.Title,

    Homeworks = data.Homeworks.Select(e => new

    {

        Title = e.Title,

        Description = e.Content,

        StartDate = e.StartDate,

        DueDate = e.DueDate,

    }).OrderByDescending(e=>e.StartDate),

    ForumPosts = data.ForumPosts.Select(e => new

    {

        Title = e.Title,

        Content = e.Content,

        PostTime = e.PostTime

    }).OrderByDescending(e=>e.PostTime),

    ScoreList = data.ScoreLists.Select(e => new

    {

        Title = e.Title,

    }),

};

改:

直接改上面查部分中得到的实体,然后context.SaveChanges()就行了,不用构造update查询。

从头到尾没有一处操作是用拼接字符串生成的,从头到尾所有操作都支持事务回滚。瞬间觉得EF用起来好简单啊~

参考: http://www.cnblogs.com/xuf22/articles/5513283.html

https://zhuanlan.zhihu.com/p/26517319


原创文章如转载,请注明出处“伊人博客

站内搜索
关注公众号(随时搜索)
文章归档
热门推荐
随机推荐
冷门晾晒