我知道这个问题似乎已经在这里提出,但我有特别的怀疑,主要是在数据库优先使用,而且在回复的问题中缺乏代码示例。
我有这些层:核心,数据和UI(asp.net mvc)。 我在MSSQL中有这些表:Person and Contact。
问题1:在数据层中,EDMX生成人员和数据POCO。我在哪里编写像SearchPersonByCity()
这样的方法?我是否需要在同一数据层中创建另一个Person类,仅用于写入数据CRUD?我是怎么做到的?请做一个例子(类,命名空间等......不一定是整个实际代码)
问题2:如何在数据层和核心(域模型)之间转换这些数据?我在哪里需要在核心(域)类中创建相同的SearchPersonByCity()
?也许只为这些数据访问方法在核心层创建另一个Person类?
请给我一些代码示例,以及大公司在现实生活中的表现,因为它似乎是如此愚蠢,而且很多代码都是为了保护我的错误。
我并不懒惰,我在这里阅读了数百页的Entity Framework书籍和问题,我无法弄清楚如何在代码中做到这一点。
答案 0 :(得分:1)
在我看来,我会在你的情况下使用存储库模式,所以首先要定义一个IRepository类:
public interface IRepository<T> where T :
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(Expression<Func<T, bool>> where);
T GetById(long id);
T GetById(string id);
T Get(Expression<Func<T, bool>> where);
}
一个抽象的基础RepositoryBase类:
public abstract class RepositoryBase<T> where T : class
{
private PersonDBEntities dataContext;
private readonly IDbSet<T> dbset;
protected RepositoryBase(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = DataContext.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
protected PersonDBEntities DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public virtual void Add(T entity)
{
dbset.Add(entity);
}
public virtual void Update(T entity)
{
dbset.Attach(entity);
dataContext.Entry(entity).State = EntityState.Modified;
}
public virtual void Delete(T entity)
{
dbset.Remove(entity);
}
public virtual void Delete(Expression<Func<T, bool>> where)
{
IEnumerable<T> objects = dbset.Where<T>(where).AsEnumerable();
foreach (T obj in objects)
dbset.Remove(obj);
}
public virtual T GetById(long id)
{
return dbset.Find(id);
}
public virtual T GetById(string id)
{
return dbset.Find(id);
}
public virtual IEnumerable<T> GetAll()
{
return dbset.ToList();
}
//You can return IQueryable if you want to build your expression true later on...
public virtual IEnumerable<T> Get(Expression<Func<T, bool>> where)
{
return dbset.Where(where).ToList();
}
}
你的PersonRepository类:
public class PersonRepository: RepositoryBase<Person>, IPersonRepository
{
public PersonRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{
}
}
public interface IPersonRepository : IRepository<Person> // Person will be your POCO class
{
}
下一步是在您的服务层上,您将定义并实现该实际的SearchPersonByCity()方法:
public class PersonService : IPersonService
{
private readonly IPersonRepository personRepository;
private readonly IUnitOfWork unitOfWork;
public PersonService(IPersonRepository personRepository, IUnitOfWork unitOfWork)
{
this.personRepository = personRepository;
this.unitOfWork = unitOfWork;
}
public IEnumerable<Person> SearchPersonByCity(string city)
{
var persons = personRepository.Get(p => p.City == city);
return persons;
}
}