我不太习惯通过CodeFirst去维护数据库(尽管这是未来实现自动编程的必经之路),还是喜欢通过数据库设计工具如PowerDesigner去建表。如果不想对EF的实体和数据表做什么映射的话,就要注意默认映射规则。以订单表(Order)和订单明细表(OrdersDetails)这类一对多的关系表为例。

数据库建表脚本:

create table Orders
(
 id ,),
 OrderNo nvarchar(),
 TotalAmount ,),
 OrderTime datetime default getdate()
)

create table OrdersDetails
(
    id ,),
    Orders_Id int,
    Product_Id int,
    ProductName nvarchar(),
    AddTime datetime default getdate()
)

create table Product
(
id ,),
name nvarchar(),
)

insert into Orders(OrderNo,TotalAmount) values();
insert into Orders(OrderNo,TotalAmount) values();
insert into Orders(OrderNo,TotalAmount) values();
insert into Orders(OrderNo,TotalAmount) values();
insert into Orders(OrderNo,TotalAmount) values();

insert into OrdersDetails(Orders_Id,Product_Id,ProductName) values(,,'Iphone8');
insert into OrdersDetails(Orders_Id,Product_Id,ProductName) values(,,'MI6');
insert into OrdersDetails(Orders_Id,Product_Id,ProductName) values(,,'HW7');
insert into OrdersDetails(Orders_Id,Product_Id,ProductName) values(,,'MZ');

insert into Product(Name) values('Iphone8');
insert into Product(Name) values('MI6');
insert into Product(Name) values('HW7');
insert into Product(Name) values('MZ');

总结的几个规则:

1.明细表的表明要用复数形式即 OrdersDetails

2.外键关系要 关联表名称_Id:Orders_Id,即使实体类是OrdersId也是去查找Orders_Id列

3.除了关联外键外其他字段最好用驼峰式命名,不要包含_或-

实体类和DbContext如下:

public class OrderManamgerDBContext : DbContext
    {
        public DbSet<Orders> Orders { get; set; }
        public DbSet<OrdersDetails> OrdersDetails { get; set; }

        public OrderManamgerDBContext() { }
        public OrderManamgerDBContext(string connectionString) : base(connectionString) { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new OrdersDetailsConfiguration());

            base.OnModelCreating(modelBuilder);
        }
    }

    public class OrdersDetailsConfiguration : EntityTypeConfiguration<OrdersDetails>
    {
        public OrdersDetailsConfiguration()
        {
            //不是按照EF默认规则命名的需要手动映射
            //HasEntitySetName("OrdersDetails");
            //Property(t => t.OrdersId).HasColumnName("Orders_Id");
            //Property(t => t.ProductId).HasColumnName("Product_Id");
        }
    }

    public class Orders
    {
        public int id { get; set; }
        public string OrderNo { get; set; }
        public decimal TotalAmount { get; set; }
        public DateTime OrderTime { get; set; }
        public List<OrdersDetails> OrdersDetail { get; set; }
    }

    public class OrdersDetails
    {
        public int id { get; set; }
        public int Orders_Id { get; set; }
        public int Product_Id { get; set; }
        public string ProductName { get; set; }
        public DateTime AddTime { get; set; }
    }

如果实体类和数据表字段命名方式不一样就需要手动映射:

 public class OrdersDetail
    {
        public int id { get; set; }
        public int OrdersId { get; set; }
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public DateTime AddTime { get; set; }
    }

这个时候就要把DbContext中的注释放开

控制台程序,采用积极加载方式:

class EFTest
    {
        static OrderManamgerDBContext odmdb = new OrderManamgerDBContext("DbContext");
        //static OrderManamgerDBContext odmdb = new OrderManamgerDBContext(ConfigurationManager.ConnectionStrings["DbContext"].ConnectionString);
        public static void Main(string[] args)
        {

            );

            //var rlt = odmdb.Orders.Where(od => od.id == 1);

            foreach(var itm in rlt)
            {
                Console.WriteLine("单据编号 "+itm.OrderNo + "\r\n明细产品:");
                foreach (var citm in itm.OrdersDetail)
                {
                    Console.WriteLine(citm.ProductName);
                }
            }

            string sql = rlt.ToString();

            Console.Read();
        }
    }

建议能按照默认规则设计就按照默认规则设计,EF的一个初衷就是减少工作量

EntityFramework默认映射规则的更多相关文章

  1. 使用Logstash创建ES映射模版并进行数据默认的动态映射规则

    本文配置为 ELK 即(Elasticsearch.Logstash.Kibana)5.5.1. Elasticsearch 能够自动检测字段的类型并进行映射,例如引号内的字段映射为 String,不 ...

  2. SpringMVC注解汇总(二)-请求映射规则

    接上一节SpringMVC注解汇总-定义 讲到Httpy请求信息 URL路径映射 1)普通URL路径映射 @RequestMapping(value={"/test1", &quo ...

  3. SpringMVC学习系列(3) 之 URL请求到Action的映射规则

    在系列(2)中我们展示了一个简单的get请求,并返回了一个简单的helloworld页面.本篇我们来学习如何来配置一个action的url映射规则. 在系列(2)中我们在HelloWorldContr ...

  4. EntityFramework 实体映射到数据库

    EntityFramework实体映射到数据库 在Entity Framework Code First与数据表之间的映射方式实现: 1.Fluent API映射 通过重写DbContext上的OnM ...

  5. SpringMVCURL请求到Action的映射规则

    SpringMVC学习系列(3) 之 URL请求到Action的映射规则 在系列(2)中我们展示了一个简单的get请求,并返回了一个简单的helloworld页面.本篇我们来学习如何来配置一个acti ...

  6. Springboot学习02-webjars和静态资源映射规则

    Springboot学习01-webjars和静态资源映射规则 前言 1-以前我们在IDEA中创建一个项目,添加web依赖包,我们现在是一个web应用,应该在man目录下面有一个webapp文件夹,将 ...

  7. 配置AutoMapper映射规则《转》

    配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我们需要先进行映射规则的配置. public class Source { public int SomeVal ...

  8. go培训课程都学什么?xorm框架学习系列(二):xorm结构体映射规则和表操作

    上节内容我们学习了基本的xorm框架的知识和基础配置的相关信息.本节课内容我们继续学习相关的知识和相关操作. 名称映射规则 名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射. ...

  9. SpringCloud Zuul 路由映射规则配置

    阅读目录 前言 快速入门 路由详解 Cookie与头信息 本地跳转 Hystrix和Ribbon支持 过滤器解释 动态加载 后记 回到目录 前言 本文起笔于2018-06-26周二,接了一个这周要完成 ...

随机推荐

  1. 自动生成getter,setter方法的插件lombok

    1.在InteiliJ IDEA上安装lombok插件,并重启 . 2.在pom.xml文件中添加依赖 <dependency>    <groupId>org.project ...

  2. 冲顶大会APP技术选型及架构设计

    我在1月4日看到虎嗅推送"王思聪撒币"的消息,然后开始推敲背后技术.其中涉及直播流.实时弹幕.OAuth2.0开放授权.SMS api.Push网关.支付接口等业务,其技术实现并不 ...

  3. thinkphp3.2.3使用ajax 的一些坑——使用AjaxReturn()后,直接返回null,模板文件不起作用

    从接触thinkphp到今天,填完此坑,必有其他的坑有会冒出来.哎!这个填坑之路我想是没有尽头的了. 最近,需要使用ajax完成一些操作,一开始想Ajax简单啊,不过是一种提交数据的方式,不过是害苦了 ...

  4. ASP.NET Core使用静态文件、目录游览与MIME类型管理

    前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因 ...

  5. (class file version 53.0), Java Runtime versions up to 52.0错误的解决方法

    遇到这个错误是在Apache Tomcat上部署应用程序的时候遇到的,具体的错误描述是: java.lang.UnsupportedClassVersionError: HelloWorld has ...

  6. Netty对Protocol Buffer多协议的支持(八)

    Netty对Protocol Buffer多协议的支持(八) 一.背景 在上篇博文中笔者已经用代码演示了如何在netty中使用Protocol Buffer,然而细心的用户可能会发现一个明显的不足之处 ...

  7. golang 栈操作

    Monk's Love for Food   Our monk loves food. Hence,he took up position of a manager at Sagar,a restau ...

  8. mysql启动日志文件log_bin

    今天正在无所事事的时候,突然收到需要我打开mysql的log_bin,当时我就懵逼了...不多说别的,我连这个log_bin在哪里,怎么知道是否启动了都不知道,怎么去做? 在万分纠结下,查询了很多资料 ...

  9. C# 的基本数据类型

    bool System.Boolean 4Byte 32bit布尔型变量 逻辑值,true或者false,默认值为false byte System.Byte 1Byte 8bit无符号整数无符号的字 ...

  10. 由浅入深SCF无服务器云函数实践

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...