我試圖與存儲庫層一起實現業務層(服務層)。所以我的項目有以下幾層EF < ---存儲庫< ---服務< ---控制器< ---查看。將單個dbcontext用於服務層的工作單元
我的上下文類的樣子:
public class ToDoContext : DbContext
{
public ToDoContext()
: base("ToDoContext")
{
}
public virtual DbSet<Project> Projects { get; set; }
public virtual DbSet <Collaborator> Collaborators { get; set; }
public virtual DbSet<ActionTask> Tasks { get; set; }
}
我ProjectRepository樣子:
public class ProjectRepository : IProjectRepository, IDisposable
{
ToDoContext Context;
public ProjectRepository(ToDoContext context)
{
this.Context = context;
}
public virtual List<Project> AllProjects()
{
IQueryable<Project> projects = Context.Projects;
return projects.ToList<Project>();
}
public Project Find(int? id)
{
// some code
}
public void InsertOrUpdate(Project project)
{
// some code
}
public void Delete(int? id)
{
// some code
}
public void Save()
{
// some code
}
public void Dispose()
{
Context.Dispose();
}
}
我ProjectService類的樣子:
public class ProjectService : IProjectService
{
IProjectRepository ProjectRepo;
ICollaboratorRepository CollaboratorRepo;
public ProjectService(IProjectRepository projectRepo, ICollaboratorRepository collaboratorRepo)
{
this.ProjectRepo = projectRepo;
this.CollaboratorRepo = collaboratorRepo;
}
public List<Project> GetAllProjects()
{
return ProjectRepo.AllProjects();
}
public void CreateProject(FormCollection formData)
{
// code to parse form data as per my business needs
// code to code to fetch related collaborator list
// save the project data
}
public List<Collaborator> GetCollaborators(string[] collaboratorId)
{
// Fetch collaborator list using collaborator repository
return CollaboratorRepository.GetAllCollaborators();
}
}
同樣地,我已經實現了服務和存儲庫層爲我的合作者。
總結代碼我的createProject()使用合作者庫中ProjectService類方法獲取合作者名單,並創建一個新的項目,這個新創建的項目安裝合作者名單,並保存it.So我想對我來說這整個過程是一個工作單位。
當我取使用CollaboratorRepository合作者的名單,並儘量節省使用ProjectRepository新創建的項目,它引發了我的錯誤「一個實體對象不能被IEntityChangeTracker。的多個實例引用」。我想這是因爲CollaboratorRepository dbcontext尚未處理。所以我在使用新的上下文之前手動處理每個上下文。我知道我無法承擔手動處理上下文的開銷。任何人都可以幫助我嗎?
我知道我應該爲一個工作單元使用相同的dbcontext對象。但是,當dbcontext對象暴露於存儲庫而不是服務層時,我不知道如何實現這一點。
你在哪裏初始化ToDoContext ..您是否使用DI還是什麼? –
是的,我正在使用DI(Ninject)。 – amanraj
你可以分享它,你如何使用它,因爲我認爲問題將在 –