C# CodeFirst编程模型一
定义实体类型:
定义两个实体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编程模型一的更多相关文章
- JS魔法堂:深究JS异步编程模型
前言 上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...
- 多线程之异步编程: 经典和最新的异步编程模型,async与await
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- jQuery插件编写及链式编程模型小结
JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...
- 云巴:基于MQTT协议的实时通信编程模型
概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...
- 第3章 窗口与消息_3.1Windows编程模型
第3章窗口与消息 3.1 Windows_编程模型 (1)窗口程序的运行过程 ①设计窗口 ②注册窗口类(RegisterClassEx).在注册之前,要先填写RegisterClassEx的参 ...
- MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型
1.1 Windows编程模型 为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行.例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身 ...
- 金蝶 K/3 Cloud 服务端控件编程模型
如下图是服务端已有的控件编程模型
- 谈谈c#中异步编程模型的变迁
大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. Beg ...
随机推荐
- [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树
题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...
- js中的面向对象入门
什么是对象 我们先来看高程三中是如何对对象进行定义的 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个 ...
- Troubleshooting OpenStack 瘫痪 - 每天5分钟玩转 OpenStack(160)
这是 OpenStack 实施经验分享系列的第 10 篇.是软件就会有 bug,OpenStack 也不例外,只要用它就一定会遇到故障.Troubleshooting(故障排除)是运维 OpenSta ...
- R语言入门(二)基础语法
1.help可以提供帮助,如help(nchar), help("[["),或者用?nchar也能获取帮助.example(nchar)可以获取到某个主题的使用方法. 2.ncha ...
- 实现自动构建编译javaweb项目并发布到N台服务器
前言 当你使用nginx实现了负载均衡,当你有了超过3台以上的应用服务器时,一个特别头疼的问题就来了,发布项目好麻烦. 你每次都要在本地编译打包一遍,然后手动复制到每一台服务器上面去,如果只有一两台服 ...
- 关于Http请求后返回json乱码的问题
其实很多时候我们在做http请求数据返回的时候经常会莫名发现会出现乱码,大部分时候我们都觉得是编码不对造成的. 一般情况下正常我们默认都是作个很简单的操作,直接使用UTF-8编码基本问题就搞定了 Ht ...
- 初写Python
#!/usr/bin/env python (指定用什么解释器运行脚本以及解释器所在的位置) # -*- coding:utf-8 -*- (用来指定文件编码为utf-8的) # 无效的内容,只做 ...
- 一道面试题引发的pythonic
一道测试工程师面试题(来自搜狗): 自己写了解法: # -*- coding: utf-8 -*- import re #从整体log中过滤出有用的部分,缩小搜索范围 def filter_log(t ...
- QtQuick 中的 qml 与 Qt 的 C++
QtQuick 可以使用内置的 JavaScript 引擎加载相应的 JS 代码,使用起来特别方便. 在 Qt 中使用 C++ 开发底层,QtQuick 用来加载.处理图像,然后使用 Qt 提供的接口 ...
- 关于easyUI的datebox加失去焦点事件即click、blur等
想实现日期框easyui-datebox手动输入值,手动输入失去焦点判断输入值是否合法 例如<input id="txtDate" type="text" ...