有二年没关注EF,今天无意试了下发现跟主流的Hibernate等ORM框架越来越接近了,先看下Entity类的定义:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. namespace EFSample.Model
  6. {
  7.  
  8. [Table("T_ORDER")]
  9. public class Order
  10. {
  11. [Key]
  12. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  13. public int ID { set; get; }
  14.  
  15. [StringLength()]
  16. [Column("CUSTOMER_NAME")]
  17. public String CustomerName { set; get; }
  18.  
  19. [Column("AMOUNT")]
  20. public decimal Amount { set; get; }
  21.  
  22. public virtual ICollection<OrderItem> OrderItems { set; get; }
  23.  
  24. }
  25. }
  1. using System;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.ComponentModel.DataAnnotations.Schema;
  4.  
  5. namespace EFSample.Model
  6. {
  7. [Table("T_ORDER_ITEM")]
  8. public class OrderItem
  9. {
  10. [Key]
  11. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  12. public int ID { set; get; }
  13.  
  14. [ForeignKey("Order")]
  15. [Column("ORDER_ID")]
  16. public int OrderID { set; get; }
  17.  
  18. [StringLength()]
  19. [Column("PRODUCT_NAME")]
  20. public String ProductName { set; get; }
  21.  
  22. [Column("PRICE")]
  23. public Decimal Price { set; get; }
  24.  
  25. [Column("QUANTITY")]
  26. public int Quantity { set; get; }
  27.  
  28. public virtual Order Order { set; get; }
  29.  
  30. }
  31. }

光看Attribute,已经跟Hibernate的Annotation很相似了。

配置文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <configSections>
  4. <section name="entityFramework"
  5. type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  6. </configSections>
  7.  
  8. <entityFramework>
  9. <contexts>
  10. <context type="EFSample.DAL.OrderContext, EFSample" disableDatabaseInitialization="false">
  11. <databaseInitializer type="EFSample.DAL.OrderInitializer, EFSample" />
  12. </context>
  13. </contexts>
  14. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  15. <parameters>
  16. <parameter value="v11.0" />
  17. </parameters>
  18. </defaultConnectionFactory>
  19. <providers>
  20. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  21. </providers>
  22. </entityFramework>
  23.  
  24. <startup>
  25. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  26. </startup>
  27.  
  28. <connectionStrings>
  29. <!--连接字符串,使用SQLSERVER LocalDb-->
  30. <add name="MyConn" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=OrderDatabase;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  31. </connectionStrings>
  32.  
  33. </configuration>

注:LocalDb在开发阶段很方便,但是试用中有一个小问题,如果把生成的mdf物理文件删除后,再次运行总是报错(不知道是不是个别现象),只能把Initial Catalog=OrderDatabase中的文件名改成其它名称(比如:Catalog=OrderDb),才能正常运行。

此外,NuGet Package Manager工具搞得象java的maven一样,可以自动联机下载所需的依赖项,Tools->NuGet Package Manager

输入

Install -Package EntityFramework

就能自动向project添加相关的dll引用

DbContext

  1. using EFSample.Model;
  2. using System.Data.Entity;
  3. using System.Data.Entity.ModelConfiguration.Conventions;
  4.  
  5. namespace EFSample.DAL
  6. {
  7. public class OrderContext:DbContext
  8. {
  9. public OrderContext() : base("MyConn") { }
  10.  
  11. public DbSet<Order> Orders { set; get; }
  12.  
  13. public DbSet<OrderItem> OrderItems { set; get; }
  14.  
  15. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  16. {
  17. modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  18. }
  19. }
  20. }

示例代码:

  1. using EFSample.DAL;
  2. using EFSample.Model;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6.  
  7. namespace EFSample
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. using (var db = new OrderContext())
  14. {
  15.  
  16. //直接执行Sql语句
  17. db.Database.ExecuteSqlCommand("delete from t_order");
  18.  
  19. var orders = new List<Order>(){
  20. new Order{ CustomerName="jimmy.yang",Amount=, OrderItems=new List<OrderItem>(){
  21. new OrderItem(){ Price=, Quantity=, ProductName="Mobile"}
  22. }},
  23. new Order{ CustomerName="杨俊明",Amount=, OrderItems=new List<OrderItem>(){
  24. new OrderItem(){ Price=, Quantity=, ProductName="架构之美"}
  25. }}};
  26.  
  27. //批量添加记录
  28. db.Orders.AddRange(orders);
  29.  
  30. //提交到db
  31. db.SaveChanges();
  32.  
  33. //查询
  34. var query = db.Orders.Where(c => c.CustomerName == "Jimmy.yang").AsQueryable();
  35.  
  36. //输出Sql语句
  37. Console.WriteLine(query.ToString());
  38.  
  39. List<Order> orderEntities = query.ToList();
  40.  
  41. foreach (var order in orderEntities)
  42. {
  43. Console.WriteLine(String.Format("ID:{0}/CustomerName:{1}/Amount:{2}/ItemCount:{3}", order.ID, order.CustomerName, order.Amount,order.OrderItems.Count));
  44. }
  45. }
  46.  
  47. Console.WriteLine("ok!");
  48. Console.Read();
  49. }
  50. }
  51. }

输出:

SELECT
[Extent1].[ID] AS [ID],
[Extent1].[CUSTOMER_NAME] AS [CUSTOMER_NAME],
[Extent1].[AMOUNT] AS [AMOUNT]
FROM [dbo].[T_ORDER] AS [Extent1]
WHERE N'Jimmy.yang' = [Extent1].[CUSTOMER_NAME]

ID:9/CustomerName:jimmy.yang/Amount:200/ItemCount:1
ok!

对Oracle的支持

MS默认并没有提供EF对Oracle的支持,需要到Oracle官网下载 http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html

下载比较慢,耐心等待,完成后,一路Next即可。

注意:tnsnames.ora文件的配置,一般在x:\app\client\Administrator\product\12.1.0\client_1\Network\Admin 目录下,参考内容如下:

  1. XE =
  2. (DESCRIPTION =
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.187.128)(PORT = 1521))
  4. (CONNECT_DATA =
  5. (SERVER = DEDICATED)
  6. (SERVICE_NAME = XE)
  7. )
  8. )

然后在vs中创建ADO.NET Entity Data Model时就能连接到Oracle db了,目前尚不支持Code-First,只能使用EF5,估计EF6要等明年才会正式发布
使用细节,可参考官网教程:http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t10

Sequence的处理:

Oracle中没有自增主键,msdn和oracle建议用trigger+sequence来处理自增主键的问题,即:insert前写个触发器,检测主键是否为空,如果为空,则将sequece.nextval赋值给它,参见:https://social.msdn.microsoft.com/Forums/th-TH/73453344-bbb9-4904-b77a-a9ba807dcfd2/oracle-e-entityframework?forum=mvcpt

示例代码:

  1. create sequence S_CD_TIPO minvalue 1 maxvalue 9999999 start with 1 increment by 1;
  2.  
  3. create or replace trigger tp_procedimento_trigger
  4. before insert on tp_procedimento for each row
  5. begin
  6. if :new.cd_tipo is null then select s_cd_tipo.nextval into :new.cd_tipo from dual;
  7. endif;
  8. end;

但我个人并不喜欢这种做法,感觉对db有点“侵入”,我比较喜欢在c#代码层掌控一切的感觉,如果大家跟我有一样的癖好,可以这么干:

  1. using System;
  2. using System.Data;
  3. using System.Data.Entity;
  4.  
  5. namespace EntityFrameworkTest
  6. {
  7. public static class SequenceHelper
  8. {
  9. public static int GetNextVal(this DbContext db,String sequenceName) {
  10. if (db.Database.Connection.State != ConnectionState.Open) {
  11. db.Database.Connection.Open();
  12. }
  13. var cmd = db.Database.Connection.CreateCommand();
  14. cmd.CommandText = String.Format("select {0}.nextval from dual", sequenceName);
  15. cmd.CommandType = CommandType.Text;
  16.  
  17. int result = ;
  18. int.TryParse(cmd.ExecuteScalar().ToString(),out result);
  19.  
  20. return result;
  21. }
  22. }
  23. }

对DbContext写一个扩展方法,手动传入Sequence名称,然后在添加记录时,这样用:

  1. using System;
  2. using System.Linq;
  3.  
  4. namespace EntityFrameworkTest
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. using (MyDbContext db = new MyDbContext())
  11. {
  12. //insert
  13. T_BAS_AGENT newAgent = new T_BAS_AGENT();
  14. newAgent.AGENT = "XYZ";
  15. newAgent.CYEAR = ;
  16. newAgent.RECID = db.GetNextVal("SEQ_T_BAS_CARRIER");
  17. db.T_BAS_AGENT.Add(newAgent);
  18. db.SaveChanges();
  19.  
  20. //query
  21. var findAgent = db.T_BAS_AGENT.SingleOrDefault(c => c.RECID == newAgent.RECID);
  22. Console.WriteLine(string.Format("{0}/{1}/{2}", findAgent.RECID, findAgent.AGENT, findAgent.CYEAR));
  23.  
  24. }
  25.  
  26. Console.Read();
  27. }
  28. }
  29. }

.NET:Entity Framework 笔记的更多相关文章

  1. Entity Framework笔记(一)

    最近在看MVC方面的资料,看了几个教程都在使用Entity Framework做数据持久化.之前也听说过这个东西,在微软的网站上看过一个演示视频,但都没怎么去仔细研究.MVC的东西太庞大了,先慢慢熟悉 ...

  2. Entity Framework 笔记(一)

    Entity Framework概述 EF是一个对象关系映射(ORM)框架,允许开发人员使用特定于域的对象关系型数据,开发人员通常不需要编写大量的数据访问代码.使用EF,开发者可以利用LINQ进行查询 ...

  3. Entity Framework笔记(二)

    前几日学习了在VS2010Console项目中使用Entity Framework,并且使用Code First模式.通过编写Model类,来生成数据库对应的表.并且,往表中写入数据以及获取表中的所有 ...

  4. Entity Framework 学习笔记(2)

    上期回顾:Entity Framework 学习笔记(1) Entity Framework最主要的东西,就是自己创建的.继承于DbContext的类: /// <summary> /// ...

  5. Entity Framework学习笔记

    原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html Entity Framework学习笔记——错误汇总   之前的小项目做完了,到了总结经验和 ...

  6. Entity Framework 6 学习笔记2 — 增、删、改、显示简单代码示例

    前言 通过 “Entity Framework 6 学习笔记1 — 介绍和安装方法”文章我相信大家对EF的安装应该没什么问题了,整体安装还是比较简单的,只需要通过Nuge搜索EF然后安装就可以了,这也 ...

  7. ADO.NET Entity Framework学习笔记(3)ObjectContext

    ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转]   说明 ObjectContext提供了管理数据的功能 Context操作数据 AddObject ...

  8. .NET 5学习笔记(10)——Entity Framework Core之切换SQLServer和SQLite

    上一篇我们梳理了CodeFist的一般流程,本篇我们讨论如何在一套代码中,支持SQL Server和SQLite的切换.同时从本篇开始,我们从.NET Core 3.1 迁移到.NET 5.相信.NE ...

  9. MVC中使用Entity Framework 基于方法的查询学习笔记 (一)

    EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦.闲话不多说,现在开始一个MVC项目,在项目中临床学习. 创建MVC项目 1.“文件”--“新建项目”-- ...

随机推荐

  1. 转载文章----初识Ildasm.exe——IL反编译的实用工具

    转载地址http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要:(路径:C:\Program ...

  2. 开源游戏 “Elvish Bird”

    简介: 这个游戏是我在今年(2014/03)课余时闲着无聊做的一个冒险类小游戏,总共花了5个工作日才完成,为了游戏的效率,做了很多优化,目前在IE8以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...

  3. 开源游戏“2048”IOS移植版

    简介: 这个游戏是我在今年(2014/05)课余时闲着无聊做的一个益智类小游戏,总共花了4个工作日才完成,为了游戏的效率,做了很多优化,目前在IE5以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...

  4. 在网页中显示CHM (c# csharp .net asp.net winform)

    CHM即“已编译的帮助文件”,主要由.hhc(目录文件)..hhk(索引文件)以及相应的帮助主题文件(.html,.htm)这些内容编译而成. 方法对比 在网页中显示CHM内容,大致有以下几种办法: ...

  5. Google Nexus5在linux下刷原生安卓 android6.0

    之前将Nexus5刷成了MIUI系统,现在想体验一下安卓6.0,网上都是windows的教程,但如何在linux下刷机呢? 首先准备环境和工具: 1. 我的linux系统是lubuntu 15.10 ...

  6. jQuery设置disabled属性

    先比较下readOnly和disabled: readOnly 只针对input(text/ password)和textarea有效: disabled 对于所有的表单元素都有效,包括select, ...

  7. 【译】Java中的枚举

    前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...

  8. lvm[12446]: Another thread is handling an event. Waiting

    在检查一Linux服务器时,发现日志里面有大量"lvm[12446]: Another thread is handling an event. Waiting..." Jul  ...

  9. asp.net mvc jQuery 城市二级联动

    页面效果图: 数据库表结构: 首先在数据库中创建省级.城市的表,我的表如下:我用了一张表放下了省级.城市的数据,用level划分省份和城市,parentId表示该城市所在省份的id 主要文件有:ind ...

  10. windows开关机时间记录

    1. 开机时间记录批处理文件,kai.bat @echo off echo %date% %time% 开机 >>D:\开关机记录\开关机时间.txt 2. 关机时间记录批处理文件,gua ...