??
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中添加:
providerName="System.Data.SqlServerCe.4.0"<!--数据库连接器-->
connectionString="Server=192.168.100.100;Database=ProductContext;UserID=sa;Password=sa;Trusted_Connection=False;Persist SecurityInfo=True "/>
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
Dinner one = onenerddinners.d_dinners.Where(a=> a.eventdate >DateTime.Now).FirstOrDefault();//单表查询
var two = from p in onenerddinners.d_dinners
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
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
{
}
7.使用模型构建器。为了使用模型构建器,必须重写 DbContext 的一个方法 OnModelCreating
public class Order
{
}
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
8.每次修改code的时候是否要创建数据库
更多介绍,请见http://msdn.microsoft.com/en-us/data/jj193542.aspx