【问题标题】:Referencing Field from 1 class in another引用另一个类中的一个类的字段
【发布时间】:2018-04-24 18:15:58
【问题描述】:

假设我有两个课程,ProjectDocumentDocument 是属于某个项目的文档的类。我在Document 中引用ProjectID 作为它自己的财产。我应该这样做还是应该引用 Project 以获取项目 ID?
我在文档类中使用项目 ID 的一个例子是当我添加一个新文档并且需要知道该文档所属的项目时。

public class Project
{
    private int _ID;
    private string _Name;
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
}

public class Document
{
    private int _ID
    private string _Title
    private int _ProjectID

    public int ID
    {
         get { return _ID; }
         set { _ID = value; }
    }
    public string Title
    {
         get { return _Title; }
         set { _Title = value; }
    }
    public int ProjectID
    {
         get { return _ProjectID; }
         set { _ProjectID = value; }
    }
    public DataSet GetDocumentsByProjectID()
    {
        var dbhelper = new DatabaseHelper();
        dbhelper.CommandText = "Get_Documents_By_Project_Select";
        SqlParameter[] parameterList = {
            new SqlParameter("projectid", ProjectID)
        };
        dbhelper.CommandParameters = parameterList;
        return dbhelper.ExecuteQuerySP();
    }
}

【问题讨论】:

  • 你应该做的第一件事是使用 auto properties 而不是你正在做的事情:public int ID { get; set; } 它会减少你的代码一吨
  • 这真的取决于你将如何在你的代码中使用Document。例如,就目前而言,它完美地代表了一个数据库表(通常称为实体)。您能否添加一些代码以便我们了解这些类的上下文?
  • 我添加了一个示例,我认为这也是我有些困惑的地方,是将其表示为一个实体或将其表示为文档应具有的唯一属性。

标签: c# class oop


【解决方案1】:

您显示的类通常称为实体。这些应该尽可能地表示一个数据库表。考虑到这一点,从 Documents 存储对 Project 的引用的唯一方法是通过 Documents 表中的 ProjectId 属性。
这种建模类的方式的第二部分是添加导航属性,以便于导航(从父级到子级以及从子级到父级)关系。

如果您使用了 ORM,例如 Entity Framework 或 NHibernate,那么您将或多或少地定义您的类。

一个不那么小的挑剔是您应该使用自动属性来定义您的属性并删除支持字段。

然后,您的实体应如下所示:

public class Project
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Document> Documents { get; set; }
}

public class Document
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public string Title { get; set; }

    public Project Project { get; set; }
}

【讨论】:

  • 为什么我在 Document 类中同时使用 ProjectID 和对 Project Class 的引用?
  • @Marc 因为 ProjectId 表示存储的内容,而 Project 属性只是内存中的帮助器
  • 使用实体框架是最好的方法吗?我认为除了我的类的设置方式之外,我没有使用实体框架
  • 实体框架是一个 ORM。是否需要它取决于应用程序的需求,但它是开发面向数据库的应用程序的快速方法
【解决方案2】:

单个项目可能包含多个文档,在这种情况下,关系将是多对一(单个项目的多个文档)。在多对一关系中,如果我们将 Project 保留为属性字段,则 项目详细信息将不明确。在这种情况下,您的方法会更好。

public class Document
{
    public int ID { get; set; }
    public string Title { get; set; }
    public int ProjectId { get; set; }
}

优雅的方法

您可以在 Project 类中创建 Documents 列表,这将实现多对一的关系

public class Project
{
    public string Name { get; set; }
    public int ID { get; set; }
    public List<Documents> Documents { get; set; }
}

【讨论】:

  • 请提供不赞成票的理由,以便我改进答案
【解决方案3】:

在Document类中添加Project作为属性并取出projectID

    public Project Project { get; set; }

【讨论】:

  • 问题不是怎么做,而是该不该做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多