ASP.NET实体框架6集合的HashSet或List?

Ala*_*an2 11 c# sql-server asp.net entity-framework entity-framework-6

我的EF模型看起来像这样:

public class ContentStatus
{
    public ContentStatus()
    {
        this.Contents = new List<Content>();
    }

    public int ContentStatusId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Content> Contents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是我也看到了如下所示的implementatins:

public class ContentStatus
{
    public ContentStatus()
    {
        this.Contents = new HashSet<Content>();
    }

    public int ContentStatusId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Content> Contents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是此Object的DDL:

CREATE TABLE [dbo].[ContentStatus] (
    [ContentStatusId] INT           NOT NULL,
    [Name]            NVARCHAR (50) NOT NULL,
    CONSTRAINT [PK_ContentStatus] PRIMARY KEY CLUSTERED ([ContentStatusId] ASC)
);
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我应该使用哪个甚至是否存在差异,何时使用List以及HashSet何时适用.

谢谢

Sti*_*gar 6

这取决于您的用例,但在大多数情况下,您只能将一个项目添加到集合中一次,因为例如每个状态仅对内容应用一次.我怀疑你可以在状态中出现两次内容.因此,HashSet是正确的数据结构,因为它可以防止重复.如果一个项目可以复制List将是正确的但我没有在实践中遇到这个,甚至不知道EF将如何处理它.

作为旁注,我建议您不要在实体中包含项目集合,除非您需要它.例如,如果您要构建一个Web应用程序来列出产品,您可能会有一个视图,其中显示单个产品及其标签.因此,产品应该有一组标签,以使这种情况更容易.但是,您可能没有显示带有其产品集合的标记的页面,因此标记不应具有Products属性.它只是不关心相关产品.看来这个Status实体并不关心它的内容集合.


Cal*_*ton 0

所以 aHashSet<T>定义

而 aList<T>不具备这些能力。

所以我想这取决于所需的特性和性能(在小型设备上可以忽略不计)。它们都是可以枚举的。

性能(尽管可能存在微小差异)将在读取和写入两个部分中体现出来。正如肖恩评论的那样,由于哈希码计算和唯一性比较,写入可能会受到惩罚。但读取速度非常快(o(1))。

所以实际上,这一切都取决于所需的特性。

在我的项目中,我会使用List<T>,但这是我的惯例。你可以确定自己的惯例,只要你坚持下去。