当前位置: 代码迷 >> 综合 >> entity framework使用(codefirst)
  详细解决方案

entity framework使用(codefirst)

热度:97   发布时间:2024-01-21 22:24:59.0
??
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属性
.HasDatabaseGeneratedOpti on(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.SetCompatibleTextRenderi ngDefault(false);
                 
                  //Database.SetInitializer<ELSDbContext>(newCreateDatabaseIfNotExist s<ELSDbContext>());//存在了就不创建
                      Database.SetInitializer<ELSDbContext>(newDropCreateDatabaseIfMode lChanges<ELSDbContext>());//模型改变了就清空重建数据库
                                   
                      Application.Run(new LoginForm());
              }
      }
更多介绍,请见http://msdn.microsoft.com/en-us/data/jj193542.aspx     
  相关解决方案