定义实体类型:

定义两个实体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. 深入了解Unity中LineRenderer与TrailRenderer

    LineRender和TrailRender是两个好东西,很多Unity拖尾特效都会使用到它们.一些简单的介绍可以参见官方的API文档.在这里探讨一下它们具体的渲染方式,而后给出一些Shader以便更 ...

  2. Tomcat 实现热部署

      热部署概念   热部署是指在你对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效,配置文件的修改除外     热部署好处   每次打增量包的时候就不用重新启动tomcat了   ...

  3. Ionic2中集成腾讯Bugly之自定义插件

    Ionic2混合开发,入坑系列:Ionic2中集成腾讯Bugly之自定义插件 1.编写Bugly.js代码 var exec = require('cordova/exec'); module.exp ...

  4. Unbutu14.04 切换ROOT用户后无法启用音频

    系统环境: Ubuntu14.04 x64 问题描述: 今天安装了Ubuntu14.04的64位系统,启用root用户登录后,观看视频时出现没有声音的现象. 问题原因: Ubuntu安装后默认root ...

  5. DOM基础(四)

    每次写DOM的时候,就觉得好像没什么好写,因为涉及到知识点的方面的确不多,对于DOM来说,更多的还是练习为主.在练习的时候,最好能结合着js基础语法的知识点来学习.这样,在学习DOM的时候就不会那么枯 ...

  6. [HDU1282]回文数猜想

    Problem Description 一 个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒 序数相加, ...

  7. 模拟Struts2框架Action的实现

    1.具体项目结构如下:

  8. Cookie和Session的原理图

    Cookie Session

  9. Maximum Depth of Binary Tree leetcode

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  10. spring或springmvc自动生成applicationcontext.xml或springmvc文件(此文转载和借鉴多篇文章)

    在用spring或者springmvc框架进行开发时,编辑applicationcontext.xml等配置文件是必不可少的,在eclipse中打开applicationcontext.xml通常是这 ...