Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个类中的1个类引用字段_C#_Class_Oop - Fatal编程技术网

C# 从另一个类中的1个类引用字段

C# 从另一个类中的1个类引用字段,c#,class,oop,C#,Class,Oop,假设我有两个类,Project和Document文档是属于某个项目的文档的类。我在文档中引用了ProjectID作为它自己的属性。我应该这样做,还是应该引用项目以获取项目id? 我在文档类中使用项目ID的一个示例是,我添加新文档时,需要知道该文档所属的项目 public class Project { private int _ID; private string _Name; public string Name { get { return _

假设我有两个类,
Project
Document
<代码>文档是属于某个项目的文档的类。我在
文档
中引用了
ProjectID
作为它自己的属性。我应该这样做,还是应该引用
项目
以获取项目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();
    }
}

将项目作为属性添加到Document类中,并取出projectID

    public Project Project { get; set; }

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

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

优雅的方法

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

public class Project
{
    public string Name { get; set; }
    public int ID { get; set; }
    public List<Documents> Documents { get; set; }
}
公共类项目
{
公共字符串名称{get;set;}
公共int ID{get;set;}
公共列表文档{get;set;}
}

显示的类通常称为实体。它们应该尽可能多地表示一个数据库表。考虑到这一点,存储文档中对项目的引用的唯一方法是通过文档表中的
ProjectId
属性。
这种建模类方法的第二部分是添加导航属性,以使导航(从父级到子级以及从子级到父级)关系更容易

如果您使用了ORM,比如EntityFramework或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; }
}
公共类项目
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection文档{get;set;}
}
公共类文档
{
公共int Id{get;set;}
公共int ProjectId{get;set;}
公共字符串标题{get;set;}
公共项目{get;set;}
}

您应该做的第一件事是使用而不是您正在做的事情:
public int ID{get;set;}
它将使您的代码减少一个音调。这实际上取决于您将如何在代码中使用
文档。例如,就目前而言,它完美地表示了一个数据库表(通常称为实体)。你能添加一些代码以便我们理解这些类的上下文吗?我添加了一个示例,我认为这也是我感到困惑的地方,是将其表示为实体还是将其表示为文档应该具有的唯一属性。问题不是如何做,而是是否应该做。请提供否决的原因,因此,我可以改进我的回答为什么我要在Document类中同时使用Projectd和对Project类的引用?@Marc,因为Projectd表示存储的内容,而Project属性只是内存中的帮助程序。使用实体框架是最好的方法吗?我想除了我的类是如何设置的以外,我没有使用实体框架。实体框架是一个ORM。您是否需要它取决于应用程序的需要,但这是开发面向数据库的应用程序的一种快速方法