zoukankan      html  css  js  c++  java
  • Entity Framework4.2 (十)CodeFirst(EF4 .2的Code First方法)

    长假归来,祝大家:龙年吉祥,龙马精神;福旺财旺事业旺,旺上加旺!!

    差不多一个月没登录博客园了,呵呵。非常抱歉啦。

    好了,闲言少叙,书归正传。呵呵。

    ==================================================

    前面我有写过一篇《Entity Framework4.0 (三)概述(EF4 的Code First方法)》,目的是为了演示一下CodeFirst是怎么一回事。文章中的写法有些过时了,所以并不是项目中的推荐做法(Best Practice)。因为,现在我们使用功能更为完整的EF4.2的CodeFirst方法。

    下面我们就开始喽!

    说明:我们有两种方式添加EntityFramework.dll的引用:

    1)使用NuGet将自动添加的是最新版本的EntityFramework 就是EF4.2的Dll。

     EF4.2和EF4.1的区别就是修改了一个Bug: 详情参考:http://blogs.msdn.com/b/adonet/archive/2011/11/01/ef-4-2-released.aspx

    2)手动添加本地EntityFramework.dll引用的话,只能添加EF4.1而不是EF4.2,所以要下载安装EntityFramework41RC.下载地址:http://www.microsoft.com/download/en/details.aspx?id=18504

     因为使用EF4.2的dll,所以我们先简单介绍在VS2010中的小插件Nuget的使用(它可以帮助我们引入EntitiFramework.dll),并且我们有了NuGet的帮助,就没有必要下载安装EntityFramework41RC,更不必要安装更老的EF版本的CTP了(但是我以自己的血的教训建议你不要试图卸载之前版本的EntityFramework的CTP或RC,因为那样有可能会引起你的.Net Framework 或 VS2010出现问题滴)

    说明:你也可以不安装这个很Cool的工具(但是那样你就只能手动添加EF4.1的dll了)

    安装完成以后,为了安全起见,最好重启下VS2010.

    打开一个NuGet的命令行窗体,如果显示:

    Type 'get-help NuGet' to see all available NuGet commands.

    表示安装Nuget成功。

    如果你使用的是Xp SP3的操作系统,有可能因为缺少Power shell2.0而提示出错。

    此时只需要安装Power Shell2.0即可:地址http://support.microsoft.com/kb/968929,在页面的中下部,找到适合自己机器操作系统的Windows Management Framework ,下载并安装。然后重启VS2010.

    (如果在安装power shell2.0的时候,提示power shell不兼容错误时是因为之前机器装有PowerShell1.0.此时解决办法是打开“控制面板”的“添加删除程序”,注意:需要选中“显示更新”复选框才能看到PowerShell1.0,让后删除powershelll 1.0,再安装2.0即可)

    3.新建咱们的Code First 解决方案:

    File->New ->Project... 选择C# 的Console Application .命名为:EF41CodeFirstDemo

    a)如果你在前面没有安装NuGet的话,可以在项目的References上右键,手动添加.NET标签下的EntityFramework引用.

    b)如果你已经成功安装NuGet的话,在Packager Manager Console里面输入:install-package entityframework (注意:命令行内容不区分大小写滴,呵呵),此时NuGet到它的package库中下载并安装最新的EntityFramework.dll,手动的话,你是安装本地的EntityFramework.dll,因为前面安装过了EntityFramework RC了。

    在Program.cs中添加如下代码:

    Program.cs
      1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5 using System.Data.Entity;
    6 using System.ComponentModel.DataAnnotations;
    7
    8 namespace EF41CodeFirstDemo
    9 {
    10 class Program
    11 {
    12 static void Main(string[] args)
    13 {
    14 Random random = new Random();
    15
    16 using (MyContext context = new MyContext())
    17 {
    18 Class cl = new Class();
    19 cl.ClassName = "ClassName" + random.Next();
    20
    21
    22 Course c1 = new Course() { CourseName = "course1Name" + random.Next() };
    23 Course c2 = new Course() { CourseName = "course2Name" + random.Next() };
    24 Course c3 = new Course() { CourseName = "course3Name" + random.Next() };
    25
    26 Student student = new Student();
    27 student.StudentName = "Studentname" + random.Next();
    28 student.Addre = new Address {StreetNumber=111,StreetName="address"+random.Next() };
    29 student.DeliverAddre = new Address { StreetNumber = 222, StreetName = "deladdress" + random.Next() };
    30 student.Courses.Add(c1);
    31 student.Courses.Add(c2);
    32 student.Courses.Add(c3);
    33
    34
    35
    36 cl.Students.Add(student);
    37
    38 context.Classes.Add(cl);
    39
    40
    41 context.SaveChanges();
    42 }
    43 }
    44 }
    45
    46 public class MyContext : DbContext
    47 {
    48 public DbSet<Student> Students {get;set; }
    49 public DbSet<Class> Classes{get;set;}
    50
    51 public MyContext()
    52 {
    53 this.Configuration.LazyLoadingEnabled = true;
    54 Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());
    55 }
    56
    57
    58 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    59 {
    60 base.OnModelCreating(modelBuilder);
    61 //modelBuilder.Entity<Student>().ToTable("efdemo.StudentTable");
    62 //modelBuilder.Entity<Student>().Property(x => x.StudentID)
    63 // .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
    64 // .IsRequired()
    65 // .HasColumnName("TheStudentID");
    66
    67 //modelBuilder.Entity<Student>().Property(x => x.StudentName)
    68 // .IsRequired()
    69 // .HasMaxLength(128)
    70 // .HasColumnName("TheStudentName");
    71
    72 //modelBuilder.Entity<Class>().ToTable("efdemo.ClassTable");
    73 //modelBuilder.Entity<Class>().Property(x => x.ClassID)
    74 // .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
    75 // .IsRequired()
    76 // .HasColumnName("TheClassID");
    77
    78 modelBuilder.ComplexType<Address>();
    79 modelBuilder.Entity<Student>().Property(x=>x.Addre.StreetName).HasColumnName("StreetName").IsRequired();
    80 modelBuilder.Entity<Student>().Property(x => x.Addre.StreetNumber).HasColumnName("StreetNumber").IsRequired();
    81 modelBuilder.Entity<Student>().Property(x => x.DeliverAddre.StreetNumber).HasColumnName("DeliverStreeNumber");
    82 modelBuilder.Entity<Student>().Property(x => x.DeliverAddre.StreetName).HasColumnName("DeliverStreetName");
    83
    84 modelBuilder.Entity<Student>().HasMany<Course>(x => x.Courses)
    85 .WithMany(x => x.Students)
    86 .Map(m =>
    87 {
    88 m.ToTable("StudentCourse")
    89 .MapLeftKey("StuID")
    90 .MapRightKey("CorID");
    91
    92 }
    93 );
    94
    95 }
    96 }
    97
    98 [Table("efdemo.AnnoStudent",Schema="ef" )]
    99 public class Student
    100 {
    101 [Key]
    102 public int StudentID { get; set; }
    103
    104 [Required]
    105 [MaxLength(120)]
    106 public string StudentName { get; set; }
    107
    108 public Address Addre
    109 {
    110 get;
    111 set;
    112 }
    113
    114 public Address DeliverAddre
    115 {
    116 get;
    117 set;
    118 }
    119
    120 public virtual IList<Course> Courses { get; set; }
    121
    122 public Student()
    123 {
    124 this.Courses = new List<Course>();
    125 }
    126 }
    127
    128 [Table("efdemo.AnnoClass",Schema="ef")]
    129 public class Class
    130 {
    131 [Key]
    132 [Column("AnnoClassID")]
    133 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    134 public int ClassID { get; set; }
    135 public string ClassName { get; set; }
    136 public IList<Student> Students { get; set; }
    137
    138 public Class()
    139 {
    140 this.Students = new List<Student>();
    141 }
    142 }
    143
    144
    145 public class Address
    146 {
    147
    148 public int StreetNumber
    149 {
    150 get;
    151 set;
    152 }
    153
    154
    155 [StringLength(125,MinimumLength=1)]
    156 public string StreetName
    157 {
    158 get;
    159 set;
    160 }
    161 }
    162
    163 public class Course
    164 {
    165 [Key]
    166 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    167 public int CourseID
    168 {
    169 get;
    170 set;
    171 }
    172
    173 [StringLength(125,MinimumLength=1)]
    174 public string CourseName { get; set; }
    175
    176 public virtual IList<Student> Students { get; set; }
    177
    178 public Course()
    179 {
    180 this.Students = new List<Student>();
    181 }
    182 }
    183
    184 }

    上面代码中分别演示了两种方法:

    一种使用Annotation。

    1  [Table("efdemo.AnnoStudent",Schema="ef" )]   
    2 public class Student {...}

    另一种是基于方法的:

    1  modelBuilder.ComplexType<Address>();       
    2
    3 modelBuilder.Entity<Student>().Property(x=>x.Addre.StreetName).HasColumnName("StreetName").IsRequired();

    未完待续。。。。

  • 相关阅读:
    REVERSE!REVERSE!REVERSE!
    java和数据结构的面试考点
    39. recover rotated sorted array恢复旋转排序数组
    33. Search in Rotated Sorted Array旋转数组二分法查询
    搜索旋转排序数组 II
    Eclipse 查找
    在Java中返回多个值
    Java的标识符
    fwprintf (File input/output) – C 中文开发手册
    CSS盒子模型介绍 | CSS Box Model: Introduction to the CSS box model (Miscellaneous Level 1) – CSS 中文开发手册
  • 原文地址:https://www.cnblogs.com/marksun/p/2331310.html
Copyright © 2011-2022 走看看