你的问题比较广泛。例如,“使用EF访问数据库内容的最佳方式”是什么意思?从性能方面来说最好的方式?
我会尝试通过给出我喜欢的选项(我大多数情况下都使用某种变体),来回答这个问题,它使用了存储库模式。如果您直接使用EF集作为存储库,您可能会认为您不需要存储库模式,但我喜欢将它们包装在自己的存储库中。
由于我无法知道您所说的最佳方式是什么,我将提供适合典型Web项目的个人偏好。
我不会发布所有代码以使其完全功能化,但您应该清楚正在发生什么。
设置(4个项目):
UI ----------> Domain.Logic(w.Domain.Models)-----------------> Data(持有EF上下文)。
数据:
public partial class EFContextContainer : DbContext
enter code here
public EFContextContainer ()
: base("name=EFContextContainer")
{
}
public DbSet<IdentityUser> IdentityUsers { get;set; }
使用返回上下文的包装器:
public static class Database
{
public static EFContextContainerGetContext()
{
return new EFContextContainer();
}
}
你可以设置一个像这样的代码库:
接口:
public interface IRepository<T> where T : class
{
IQueryable<T> GetAll();
T GetById(Guid id);
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(Guid id);
}
实现(出于简洁起见,仅实现了Add(T entity)):
public class EFRepository<T> : IRepository<T>, IDisposable where T : class
{
public EFRepository(DbContext dbContext)
{
if (dbContext == null)
throw new ArgumentNullException("dbContext");
DbContext = dbContext;
DbSet = DbContext.Set<T>();
}
protected DbContext DbContext { get; set; }
protected DbSet<T> DbSet { get; set; }
public virtual void Add(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State != EntityState.Detached)
{
dbEntityEntry.State = EntityState.Added;
}
else
{
DbSet.Add(entity);
}
}
public void Dispose()
{
DbContext.Dispose();
}
}
领域:
领域逻辑(IdentityUserManager将是Domain.Models中的一个类):
public class IdentityUserManager
{
public void Add(IdentityUser idUser)
{
using(var idUserRepository = new EFRepository<IdentityUser>(Database.GetContext())
{
idUserRepository.Add(idUser);
}
}
}
UI:
[HttpPost]
public ActionResult Post(UserViewModel model)
{
UserIdentity user = MapUser(model);
var userManager = new IdentityUserManager();
userManager.Add(user);
return View(new UserViewModel());
}
(这并非完全在Visual Studio中编写,所以请原谅任何拼写错误。)
虽然这段代码中可能存在更多的抽象,但在此处撰写整个解决方案是荒谬的。例如,您也可以使用工作单元模式,它与存储库模式非常配合。因此,请将其视为示例,而不是实现此设置的完整指南。事情比这个示例要干净得多。
如果您想深入了解这些模式的实现,请务必查看Plural Sight上John Papa的Single Page Apps课程。他在解释这些模式的好处及其如何实现方面做得非常出色。