entity framework使用(codefirst)

来源:互联网 发布:c语言获取当前日期时间 编辑:程序博客网 时间:2024/05/14 21:15

Entity framework 目前支持的数据库有SQL Server和Oracle, DB2, MySQL等等

一、架构组成
Entity framework分为三大块:
概念层的模型(Conceptual Model):类的定义,用于显示查询操作数据库的字段.
存储层的模型(Storage Model): 数据库中的表和字段定义.
映射(Mapping):Conceptual Model和Storage Model的对应关系

二、如何使用Entity framework(codefirst方式)
1.下载EntityFramework.dll文件,添加引用到工程中

2.创建我们的class模型(Conceptual Model)
public class Dinner
{
public int dinnerid{get;set;}
public string titile{get;set;}
public string eventdate{get;set;}
public virtual ICollection rsvps{get;set;}
}

public class RSVP
{
public int rsvpid{get;set;}
public string dinnerid{get;set;}
public string email{get;set;}
public virtual ICollection dinners{get;set;}
}
这两个类是我们数据数据的数据缓存类。他们的定义很简单,只关注我们需要的数据库中的字段数据.
默认情况下(没有使用模型构建器),EF会更加模型名字,自动生成模型名字的数据库表.

3.创建和数据库上下文(Conceptual Model)
public class NerdDinners:DBContext
{
public DbSet<Dinner>d_dinners{get;set;}
public DbSet<RSVP>d_rsvps{get;set;}
}

4.添加数据库和持久层的映射(Mapping)
在app.config中添加:
 <connectionStrings>
    <addname="ELSDbContext"<!--数据库上下文--> 
providerName="System.Data.SqlServerCe.4.0"<!--数据库连接器-->
connectionString="Server=192.168.100.100;Database=ProductContext;UserID=sa;Password=sa;Trusted_Connection=False;Persist SecurityInfo=True "/>
 </connectionStrings>
5.使用
  
a.添加
using(NerdDinners onenerddinners = new NerdDinners())
{
var dinner = new Dinner()
{
titile = "part at sz",
eventdate = DateTime.Parse("2012/09/25")
};
onenerddinners.d_dinners.Add(dinner);
onenerddinners.SaveChanges();
}

b.查询
var one = from p in onenerddinners.d_dinners
           wherep.eventdate>DateTime.Now
           selectp;;//单表查询

Dinner one = onenerddinners.d_dinners.Where(a=> a.eventdate >DateTime.Now).FirstOrDefault();//单表查询

var two = from p in onenerddinners.d_dinners
 join pp in onenerddinners.d_rsvps
 on p.dinnerid equals pp.dinnerid
 select p;//多表查询

c.更改
Dinner one = onenerddinners.d_dinners.Where(a=> a.eventdate >DateTime.Now).FirstOrDefault();
one.titile = "changge";
onenerddinners.SaveChanges();

var one = from p in onenerddinners.d_dinners
           wherep.eventdate>DateTime.Now
           selectp;;//单表查询
List onelist = one.ToList();

6.class模型可以添加一些属性对字段进行限制.1.EF4.1中支持的包括如下属性:

[[Column("DepartmentName")]] 该成员映射列列名DepartmentName
[ComplexType] 复合类型
[ConcurrencyCheck] 乐观并发检查的字段
[DatabaseGenerated]
[DataMember]
[DefaultValue(true)]
[ForeignKey("Task")] 外键.Task为另一个数据库类名称
[InverseProperty]
[Key] 表示主键,自增主键[Key,DatabaseGenerated(DatabaseGeneratedOption.None)].可以编辑的主键(默认是readonly)[Key,Editable(true),DatabaseGenerated(DatabaseGeneratedOption.None)]
[MaxLength(5)] 最大长度5
[MinLength(5)] 最小长度5
[NotMapped] 在数据库中排除
[RelatedTo]  关联外键,[RelatedTo(ForeignKey ="FK_EmDepartment", Property = "Department")]
[Required]  非空字段.限定长度的非空字段[Required,MaxLength(256)]
[StringLength(10)]字符串长度10,[StringLength(50,ErrorMessage="FirstName can't over 50chars")]
[StoreGenerated]
[Table("Department")]  映射表:Department
[Timestamp] 将 Code First 中的类型为 byte[] 的字段对应到数据库中的类型为 timestamp的列

例如:
public class Book 
   [Key] 
    public string ISBN {get; set; } 

   [StringLength(256)] 
    public string Title {get; set; } 

    public string AuthorSSN{ get; set; } 

7.使用模型构建器。为了使用模型构建器,必须重写 DbContext 的一个方法 OnModelCreating
public class Order 
    public int OrderID {get; set; } 
    public string OrderTitle{ get; set; } 
    public stringCustomerName { get; set; } 
    public DateTimeTransactionDate { get; set; } 

public class NerdDinners:DBContext
{
public DbSet<Order>orders{get;set;}

protected override void OnModelCreating(DbModelBuildermodelBuilder) 
base.OnModelCreating(modelBuilder); 
//    Mapschemas 
modelBuilder.Entity<Order>().ToTable("efdemo.Order");//指定class模型到据库中 efdemo 架构下的 Order 表
modelBuilder.Entity<Order>().Property(x=> x.OrderID) //指定OrderID属性
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)//标识它是标识列,自增长的列
.IsRequired() //必须的列,非空
.HasColumnName("TheOrderID");//映射到数据库中的 TheOrderID
}

使用模型构建器可以在不改变模型的情况下,控制与数据库表的关系,也叫POCO.而使用属性我们可以得到丰富的模型.

8.每次修改code的时候是否要创建数据库
    static classProgram
    {
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main()
       {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
         
         //Database.SetInitializer<ELSDbContext>(newCreateDatabaseIfNotExists<ELSDbContext>());//存在了就不创建
           Database.SetInitializer<ELSDbContext>(newDropCreateDatabaseIfModelChanges<ELSDbContext>());//模型改变了就清空重建数据库
                  
           Application.Run(new LoginForm());
       }
    }
更多介绍,请见http://msdn.microsoft.com/en-us/data/jj193542.aspx   
0 0
原创粉丝点击