欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Ef-Code-First 使用实体类映射出数据库

程序员文章站 2022-07-23 20:38:10
最近面试时很多面试官都问到了EF框架 好记性不如烂笔头 赶紧记下来 code-first是EF框架中的一种,是使用实体类来进行数据库表的映射,所以实体类中的字段要规范(我认为) 比如: 如果有外键的话 一定要搞清楚一对多、多对一和多对多的关系 比如一个用户对应一个用户详细信息可以写成这样: 用户详细 ......

最近面试时很多面试官都问到了EF框架 好记性不如烂笔头

赶紧记下来

code-first是EF框架中的一种,是使用实体类来进行数据库表的映射,所以实体类中的字段要规范(我认为) 比如:

Ef-Code-First 使用实体类映射出数据库

如果有外键的话 一定要搞清楚一对多、多对一和多对多的关系

比如一个用户对应一个用户详细信息可以写成这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace QQManager.Models
{
    public class User
    {
        public Guid Id { get; set; }

        public string Name { get; set; }

        public virtual UserInfo UserInfo { get; set; }
    }
}

用户详细信息表:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace QQManager.Models
{
    public class User
    {
        public Guid Id { get; set; }

        public string Name { get; set; }

        public virtual UserInfo UserInfo { get; set; }
    }
}

如果是一对多要搞清楚他们之间的关系(谁包含谁),比如一个订单中包含多个商品

订单表:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace QQManager.Models
{
    public class Orders
    {
        public Guid Id { get; set; }
        
        public virtual List<Gooder> Gooder { get; set; }
    }
}

商品表:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace QQManager.Models
{
    public class Gooder
    {

        public Guid Id { get; set; }
        //商品名称
        public int Name { get; set; }
        //商品价格
        public int Price { get; set; }

        public virtual Orders Orders { get; set; }
    }
}

在Code-first中一个很重要的东西就是数据上下文  在这里不做介绍...因为我也搞不太懂,可以搜一下大佬的文章,顺便分享给我:)

数据上下文的主要构成

using System;
using System.Collections.Generic;

// DbContext
using System.Data.Entity;


namespace QQManager.Models
{
    /// <summary>
    /// 数据库上下文
    /// </summary>
    public class QQContext:DbContext
    {
        public QQContext() : base("name=qq")//web.config中连接字符串的名称
        {
            //  当 模型发生变化时 重新创建数据库。
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<QQContext>());

        }
        //数据表,只要是模型类就要写进来
        public virtual DbSet<Order> Orders { get; set; }
    }
}

对了,对于这种外键关系的字段,使用virtual关键字修饰最好。1是延时加载,2是。。算了 想知道还是搜最好~~

具体的关于操作数据库的语法转载:https://blog.csdn.net/u013924731/article/details/53331610

这样在mvc架构中就可以使用code-first了,主要是其他架构我没使用过.....

顺便一提的是这样写唯一的麻烦就是在使用时每次都要实例化上下文,所以在我上学时 老师叫我们的一个简单的办法:

Ef-Code-First 使用实体类映射出数据库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Web;
using System.Web.Mvc;
using QQManager.Models;

namespace QQManager.Controllers
{
    public class BaseController : Controller
    {

        protected QQContext db
        {
            get
            {
                // 从当前线程中获取上下文数据。
                QQContext _db = CallContext.GetData("qq") as QQContext;
                if (_db == null)
                {
                    _db = new QQContext();
                    _db.Database.CreateIfNotExists();
                }
                // 将上下文数据保存到当前线程中。
                CallContext.SetData("qq",_db);
                return _db;
            }
        }
    }
}
View Code

这样只要继承此类就可以直接使用上下文,名称为自定义,这里是db(开头大写,这里不规范)。

以上是我自己对这套框架的理解,多多指教。