题
我正在开发一个软件,其中有一些实体,例如:
public class Workspace
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual List<Playground> Playground { get; set; }
public virtual List<Workspace> Children { get; set; }
public virtual List<Member> Members { get; set; }
public virtual Workspace Parent { get; set; }
}
public class Playground
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual List<Service> Services { get; set; }
public virtual Workspace Workspace { get; set; }
}
public class Service
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual Playground Playground { get; set; }
}
这些是我的EF4 Poco对象。我正在使用存储库模式和以下接口:
public interface IRepository<T>
{
void Add(T entity);
void Delete(T entity);
IEnumerable<T> Get(Expression<Func<T, bool>> expression);
IEnumerable<T> Get();
void Attach(T entity);
int Save();
}
存储库有一个内部对象台面。我有一个单位工程,其中包含我的存储库的实例,并负责保存对它们的更改。
到目前为止,我做对吗?
我正在实施这样的业务逻辑层:
public class DomainWorkspaceService : DomainServiceBase
{
public DomainWorkspaceService(Workspace workspace)
: base(UnitOfWorkFactory.GetInstance())
{
}
public void Create(Workspace workspace)
{
UoW.GetRepository<Workspace>().Add(workspace);
}
public void Delete(Workspace workspace)
{
var pservice = new DomainPlaygroundService();
foreach (var playground in workspace.Playground)
pservice.Delete(playground);
foreach (var child in workspace.Children)
Delete(child);
}
}
现在,我不确定我会朝正确的方向前进。我的pocos(将)负责验证,并使我能够做类似的事情
SomeWorkspace.Children.Add(new Workspace {...});
由于这些对象与上下文关联,当我保存它们时,收集的更改是否也保存在数据库中?
另外,我希望没有工作空间和服务就无法创建我的游乐场。我应该在哪里创建并删除它们?
谢谢。
解决方案
到现在为止还挺好。
您可能想移动您的 Save
将存储库和工作单位的方法关闭。在实体框架中,您必须一次保存上下文中的所有更改;您不能以每种方式做。将其放在存储库上意味着只会保存对存储库的更改,这可能是不正确的。
您可能需要将级联从工作区到操场的级联反应作为数据库级联(实体框架将识别和支持),而不是手动编码它们。
是的,将上下文的更改保存将保存所有跟踪的更改,包括相关对象。
关于添加,如果您不揭露对象context,那么任何人都可以通过与您所曝光的对象的关系来添加操场的唯一方法。
不隶属于 StackOverflow