2009-06-21 58 views
1

我试图建立一个文档管理系统,尽管我已经阅读过有关实体,值对象,如何选择如何映射它们等信息。 ..我仍然无法弄清楚“正确”的方式是什么。非常典型地在这样的之情况,每个文档都可以beong属于一个或多个类别,可以通过属于一个或多个角色等用户查看......所以文档实体看起来是这样的:实体,值对象或域模型中的对象的枚举表示

public class Document 
{ 
    private int _id; 
    private string _title; 
    private string _brief; 
    private DateTime _publicationDate; 
    private string _author; 
    private string _source; 
    private DateTime _activeDate; 
    private DateTime _inactiveDate; 
    private IList<Category> _categories; 
    private IList<Fund> _funds; 
    private IList<Role> _roles; 
    ...etc 
} 

的实际的域mondel和应用程序的业务逻辑目前非常简单,因此Category,Fund和Role对象不包含任何业务逻辑,而且实际上只是分类,访问控制等方式(在角色的情况下)等等。数据库,因此,我将有'角色','类别','基金'表格,然后将有2列的多对多映射表:例如DocumentId和RoleId。因此,我的问题是:

如果类别,资金,角色等在域中表示为实体,例如

public class Role 
{ 
    private int _id; 
    private string _name; 

    public virtual int Id 
    { 
     get { return _id; } 
     private set { _id = value; } 
    } 

    public virtual string Name 
    { 
     get { return _name; } 
     private set { _name = value; } 
    } 
} 

或值对象还是应该例如角色仅仅是一个枚举:

public enum Role 
{ 
    AllUsers 
    ,ShareHhlders 
    ,Registered 
    ,Administrator 
} 

我与实体开始时的做法,但现在我试图创建“添加文件”功能和用户界面,并质疑它是否是正确的方法 - 在添加文档用户界面中,用户获得复选框列表组,并选择文档属于哪些类别,角色资金等。 Onec这个信息被传递给控制器​​(我使用的是ASP.NET MVC),如果已经选择了一个复选框,那么类别/角色/资金等等需要被创建并添加到文档对象中,但是要这样做类别/角色/资金的ID是必需的。因此,这意味着我必须在应用程序内维护映射对象,以获得给定类别/角色/基金的类别/角色/资金ID,以传递给类别/角色/基金对象的构造者。这真的看起来不正确,因此我问这个问题。

我开始尝试将对象更改为枚举,但之后需要单独维护用于引用完整性的枚举和类别/角色/基金/多对多映射表。这可能似乎是满足持久性的要求,但在数据库级别,我认为有必要维护单独的类别/角色/资金表,映射表和外键约束。 (也使用NHibernate进行ORM映射和持久化应该能够让它在枚举中表现良好)。

感谢

回答

2

当实体和值对象之间进行选择,重要的是要确定对象具有可以改变内部部件的唯一标识。如果对象具有唯一标识并支持内部更改,那么需要跟踪这些更改还是将其持久保存到数据库?总之,你需要坚持这些对象的CRUD操作吗?如果是这样,你可能有一个实体。如果不是,你可能有一个价值对象。

我的直觉说,如果你可以创建枚举而不是实体,那么你不需要实体对象。我投票使用NHibernate保存用于参照完整性的外键。

+0

感谢凯文 - 在这个阶段,申请的类别/基金/角色对象没有必要支持内部更改/操作。这些对象确实具有唯一的标识,但它仅用于数据库标识和参照完整性的目的。基于此,仍然要去查找枚举并处理以下缺点: 1。手动维护类别/资金/角色表和枚举(在没有代码生成的情况下) 2.重新编译应用程序以更改类别/资金/角色。 – Matthew 2009-06-21 05:21:04