定义实体类型:

定义两个实体Menu和MenuCard,一个menu关联一个menucard,menucard包含对所有menu的引用。

 public class Menu
{
public int Id { get; set; } [StringLength(50)]
public string Text { get; set; }
public decimal Price { get; set; }
public DateTime? Date { get; set; }
public MenuCard MenuCard { get; set; }
public int MenuCardId { get; set; }
}

  

public class MenuCard
{
public int Id { get; set; }
public string Text { get; set; }
public virtual ICollection<Menu> Menus { get; set; }
}

  创建数据上下文,新建类MenuContext派生于基类DbContext,使用模型构建器定义各个字段的约束和各表之间的级联关系,需要引用EntityFramework程序集。

 public class MenuContext:DbContext
{
public MenuContext():base(GetConnectionString())
{
} /// <summary>
/// Get the connection string to connect database
/// </summary>
/// <returns>connection string</returns>
private static string GetConnectionString()
{
ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["CodeFirst"];
return settings.ConnectionString;
} public DbSet<Menu> Menus { get; set; }
public DbSet<MenuCard> MenuCards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Menu>().Property(m => m.Price).HasColumnType("money");
modelBuilder.Entity<Menu>().Property(m => m.Date).HasColumnType("date");
modelBuilder.Entity<Menu>().Property(m => m.Text).HasMaxLength(40).IsRequired();
modelBuilder.Entity<Menu>().HasRequired(m => m.MenuCard).WithMany(c => c.Menus).HasForeignKey(m => m.MenuCardId);
modelBuilder.Entity<MenuCard>().Property(c => c.Text).HasMaxLength(30).IsRequired();
modelBuilder.Entity<MenuCard>().HasMany(c => c.Menus).WithRequired().WillCascadeOnDelete();
}
}

  创建数据库,填充数据。数据库初始化实现了IDatabaseInitializer<TContext>接口,这个接口由CreateDatabaseIfNotExists、DropDatabaseAlways和DropDatabaseIfModelChanges实现,新建类MenuCardInitializer

public class MenuCardsInitializer:DropCreateDatabaseAlways<MenuContext>
{
protected override void Seed(MenuContext context)
{
var menuCards = new List<MenuCard>()
{
new MenuCard {
Text ="Soups",Menus=new List<Menu>(){
new Menu {
Text = "Baked Potatoe Soup",Price=4.80m,Date=DateTime.Parse("5/22/2016",System.Globalization.CultureInfo.InvariantCulture)
},
new Menu {
Text="Rib Eye Steak",Price=5.20m,Date=DateTime.Parse("5/21/2016",System.Globalization.CultureInfo.InvariantCulture)
}
}
},
new MenuCard {
Text ="Steaks",Menus=new List<Menu>() {
new Menu {
Text="New York Sirloin Steak",
Price=6.28m,Date=DateTime.Parse("5/20/2016",System.Globalization.CultureInfo.InvariantCulture)},
new Menu {
Text="Rib Eye Steak",Price=7.20m,Date=DateTime.Parse("5/19/2016",System.Globalization.CultureInfo.InvariantCulture)}
}
}
};
menuCards.ForEach(c => context.MenuCards.Add(c));
}
}

  在program类中运行:

class Program
{
static void Main(string[] args)
{ //CreateMenus().Wait();
QueryMenu();
} /// <summary>
/// crwate data to test entity framework
/// </summary>
/// <returns></returns>
private static async Task CreateMenus()
{
using (var data = new MenuContext())
{
MenuCard card = data.MenuCards.Create();
card.Text = "Soups";
data.MenuCards.Add(card);
Menu m = data.Menus.Create();
m.Text = "Baked Potato Soup";
m.Price = 4.80m;
m.Date = new DateTime(2016, 5, 22);
m.MenuCard = card;
data.Menus.Add(m);
Menu m1 = data.Menus.Create();
m1.Text = "Cheddar Broccoli Soup";
m1.Price = 5.06m;
m1.Date = new DateTime(2016, 5, 21);
m1.MenuCard = card;
data.Menus.Add(m1);
try
{
data.SaveChanges();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
} private static void QueryMenu()
{
using (var data = new MenuContext())
{
foreach (var card in data.MenuCards)
{
Console.WriteLine(card.Text);
foreach (var menu in card.Menus)
{
Console.WriteLine("{0}-{1:d}", menu.Text, menu.Date);
}
}
}
}
}

  

C# CodeFirst编程模型一的更多相关文章

  1. JS魔法堂:深究JS异步编程模型

    前言  上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...

  2. 多线程之异步编程: 经典和最新的异步编程模型,async与await

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  3. 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  4. jQuery插件编写及链式编程模型小结

    JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...

  5. 云巴:基于MQTT协议的实时通信编程模型

    概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...

  6. 第3章 窗口与消息_3.1Windows编程模型

    第3章窗口与消息 3.1 Windows_编程模型 (1)窗口程序的运行过程   ①设计窗口   ②注册窗口类(RegisterClassEx).在注册之前,要先填写RegisterClassEx的参 ...

  7. MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

    1.1 Windows编程模型 为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行.例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身 ...

  8. 金蝶 K/3 Cloud 服务端控件编程模型

    如下图是服务端已有的控件编程模型

  9. 谈谈c#中异步编程模型的变迁

    大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. Beg ...

随机推荐

  1. ASP.NET Core MVC之Serilog日志处理,你了解多少?

    前言 本节我们来看看ASP.NET Core MVC中比较常用的功能,对于导入和导出目前仍在探索中,项目需要自定义列合并,所以事先探索了如何在ASP.NET Core MVC进行导入.导出,更高级的内 ...

  2. [Hadoop] - Hadoop3.0.x编译

    这里仅介绍一种Hadoop3.0.x版本的源码编译方式 编译过程 1. 下载源码 2. 安装依赖环境 3. 源码编译 ========================================= ...

  3. 关注云端搜索技术:elasticsearch,nutch,hadoop,nosql,mongodb,hbase,cassandra 及Hadoop优化

    http://www.searchtech.pro/ Hadoop添加或调整的参数: 一.hadoop-env.sh1.hadoop的heapsize的设置,默认1000 # The maximum ...

  4. 从零开始搭建Salt Web之封装salt-api接口

    salt-api现在已经正常运行,接下来则是实现通过调用salt-api来执行salt命令. 调用salt-api执行命令时,记得携带c_path参数 因为salt中自带了tornado这个库,所以决 ...

  5. javascript 常用api

    常用API合集 来源于:https://www.kancloud.cn/dennis/tgjavascript/241852 一.节点 1.1 节点属性 Node.nodeName //返回节点名称, ...

  6. Python 正则表达式(字符)详解

    Python正则表达式 - 简介 ​    其实正则表达式这种技术,源于一个很简单的问题:  如何通过变成使得计算机具有在文本中检索某种模式的能力? ​     而正则表达式为通过编程实现高级的文本模 ...

  7. WebGIS前端瓦片地图显示原理及实现

    目前,有很多WebGIS开发包,ArcGIS API for JS.OpenLayers.LeafLetjs等为我们从事WebGIS开发的人封装了很多强大的功能.我们很方便的使用这些库的时候,也让我们 ...

  8. nginx在CentOs下的安装及配置

    前言: 先介绍一下nginx: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强, ...

  9. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理(转)

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  10. 如何使用Vue2做服务端渲染

    花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500-700ms之间,SS ...