技术开发 频道

深入解读 Entity Framework 4.0和4.1

  我们将DemoDB.edmx和Demo.tt 两个文件COPY到EF.Model中,并且删除掉EF.DAL中的这两个文件。由于DemoDB.edmx和Demo.tt 两个文件是在EF.DAL创建的,所以移到EF.Model中他们的命名空间还是EF.DAL。不用担心,我们在EF.Model中打开DemoDB.edmx和Demo.tt两个模板文件,点击保存后,模板会自动修改命名空间为EF.Model。注意了EF.DAL中的DemoDB.Context.tt模板不要打开保存,否则DbContext的代码会丢失。 这样我们完成了Model和DAL代码的分离工作了。

  (DbContext 是EF4.1内容, 另外在VS解决方案的工具里有扩展管理器可直接下载最新的VS扩展插件,通过Library Package Manager的控制台直接添加引用)

  如果对象修改了,我们只要再保存EDM模板就可以及时更新DemoDB.tt中的对象。而DAL层基本上不需要修改。

  3. EF.DAL创建通用数据操作类库(仿Nhibernate)

  IRepository接口:(IOC注入)

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace EF.DAL{
public interface IRepository<T> where T : class, new()
{
T Create();
T Update(T entity); T Insert(T entity);
void Delete(T entity);
T Find(params object[] keyValues);
List
<T> FindAll();
}
}

  RepositoryBase 抽象基类实现

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.Entity;using EF.DAL;namespace EF.DAL{
public abstract class RepositoryBase<T>:IRepository<T> where T :class,new()
{
public DbContext context; //提供IOC注入方式接口
public RepositoryBase(DemoDBEntities context)
{
this.context = context;
}
//测试用
public RepositoryBase() { this.context = new DemoDBEntities();
} #region IRepository
<T> 成员
public T Create()
{
return context.Set<T>().Create();
}
public T Update(T entity)
{
//执行验证业务
//context.Entry<T>(entity).GetValidationResult(); if (context.Entry<T>(entity).State == EntityState.Modified) context.SaveChanges();
return entity;
}
public T Insert(T entity)
{
context.Set
<T>().Add(entity);
context.SaveChanges();
return entity;
}
public void Delete(T entity)
{
context.Set
<T>().Remove(entity);
context.SaveChanges();
}
public T Find(params object[]keyValues)
{
return context.Set<T>().Find(keyValues);
}
public List<T> FindAll()
{
return context.Set<T>().ToList();
}
#endregion
}}
0