我正在为项目管理应用程序创建一个类库。我将向您简要介绍如何设置所有实体以帮助解决问题。
user
在注册期间订阅了plan
。每个计划都包含modules/applications
,他可以在成功验证其帐户后使用。 Project
,Company
和Plans
是我为其创建类库的模块,这些是在用户生命周期的每个阶段都存在的模块。角色确定用户可以执行的操作。每个公司(只有一个用户)可以容纳许多项目,每个项目都有专门的项目负责人和他的资源。项目负责人是另一个privileges/Roles
更高的用户。现在这里是令人困惑的部分,因为对我来说似乎都很好:我应该遵循哪个类层次结构 1 或 2
User
- Subscriptions ( List<> )
- Projects ( List<> )
- Client ( Client )
- ProjectLead( User )
- Resources(List<>)
Application
- Projects ( List<> )
- Client ( Client )
- ProjectLead ( User )
- Resources ( List<> )
User
- GetProjects ( List <Project> )
混乱几乎没有到达这一点,客户端通过外键ProjectId与项目相关联。因此,在为Client创建类时,
表示客户端所属的项目应该在Client类中创建
Project Class
还是应该将客户端放在 项目类。
答案 0 :(得分:2)
我是否理解你很困惑哪个对象应与另一个对象有关系,如:
选项1:用户HAS项目(他是LEAD) 选项2:项目是用户(领导者)
还有更多。
好消息是:你不必选择。您可以编写双向关系。 有几种方法可以实现这一点。
因为你谈论外键,我是否正确地假设你使用后端数据库来保存对象?在这种情况下,您可以使用像Entity Framework这样的对象关系数据库映射器(ORM)。如果没有,你将不得不自己做一些工作,这是我个人应避免的;)
您只需先编写包含所有关系的数据库,然后让实体框架为您生成相应的类。所有这些类都有双向关系。
你有两张桌子:
实体框架会将其转换为两个类,如此
用户
项目
现在,例如,将Project对象的“User”字段设置为其他用户时,项目将自动从原始用户的“项目”列表中删除,并添加到新用户的“项目”列表中。
您可以通过在数据库上下文对象上调用.SaveChanges()方法来持久更改数据库。
双向关系的主要问题是你必须保持一致性。通过简单的一对一关系,它并没有那么糟糕,但是通过一对多关系(就像这里的情况,一个用户到多个项目),这有点困难。
下面你会发现一个使用相当优秀的ObservableCollection类的实现。
public class Project {
public string Name { get; set; }
private User _leadUser;
public User LeadUser {
get { return _leadUser; }
set {
if (_leadUser != value) {
if (_leadUser != null) {
_leadUser.Projects.Remove(this);
if (!value.Projects.Contains(this)) {
value.Projects.Add(this);
}
}
_leadUser = value;
}
}
}
}
public class User {
public string Name { get; set; }
private ObservableCollection<Project> _projects = new ObservableCollection<Project>();
public ObservableCollection<Project> Projects { get { return _projects; } }
public User() {
Projects.CollectionChanged += OnProjectCollectionChanged;
}
protected void OnProjectCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
var projects = sender as IEnumerable<Project>;
switch (e.Action) {
case NotifyCollectionChangedAction.Add:
foreach (var project in projects) {
if (project.LeadUser != this) {
project.LeadUser = this;
}
}
break;
case NotifyCollectionChangedAction.Move:
break;
case NotifyCollectionChangedAction.Remove:
foreach (var project in projects) {
if (project.LeadUser == this) {
project.LeadUser = null;
}
}
break;
case NotifyCollectionChangedAction.Replace:
break;
case NotifyCollectionChangedAction.Reset:
break;
default:
break;
}
}
}
希望这篇文章对你有用。