我不太习惯通过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. Another option for file sharing(转)

    原文地址  https://security.googleblog.com/2017/02/another-option-for-file-sharing.html Another option fo ...

  2. Webpack 2 视频教程 015 - Webpack 2 中的文件压缩

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  3. [Android游戏开发]游戏框架的搭建

    通常情况下,游戏开发的基本框架中,一般包括以下模块: 窗口管理(Window management):该模块负责在Android平台上创建.运行.暂停.恢复游戏界面等功能. 输入模块(Input):该 ...

  4. Linux入门篇(一)——基本命令

    这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...

  5. Fiddler中设置断点修改返回结果Response

    测试有时会遇到需要测试返回不同的数据前端展示出来会如何?如果去数据库中的数据会比较麻烦.这样我们可以通过fiddler设置断点来修改返回的数据实现测试不同的数据展示. 1.设置断点 (1)点击菜单栏按 ...

  6. Python中将函数作为另一个函数的参数传入并调用

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...

  7. CRUL学习记录

    在学习web相关知识的时候,了解到crul可以对网址进行请求,并可以看到网站的响应. 1.curl获取web网站返回的网页内容 命令:curl http://XXXXX 2.curl查看web网站的s ...

  8. [SharePoint Online]SharePoint Designer无法打开世纪互联版sp online站点得解决方法,报错信息:请安装更新后再重新打开

    现象描述: 装了个x64版SharePoint designer 2013, 没有装SP1,在打开国际版得office 365 online得时候完全没有问题,但是在打开世纪互联版得时候就打不开,让安 ...

  9. JS 监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的需求: 那在代码中怎样监听当点击微信.支付宝.百度糯米.百度钱包 ...

  10. JS 详解 Cookie、 LocalStorage 与 SessionStorage

    基本概念 Cookie Cookie 是小甜饼的意思.顾名思义,cookie 确实非常小,它的大小限制为4KB左右.它的主要用途有保存登录信息,比如你登录某个网站市场可以看到"记住密码&qu ...