在实体框架中使用hashset

1Am*_*ali 33 entity-framework

我想知道在构造函数中使用或不使用"hashset"创建类之间的区别.

使用代码第一种方法(4.3),可以创建这样的模型:

public class Blog
 {
     public int Id { get; set; }
     public string Title { get; set; }
     public string BloggerName { get; set;}
     public virtual ICollection<Post> Posts { get; set; }
  }

public class Post
 {
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public int BlogId { get; set; }
    public ICollection<Comment> Comments { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

或者可以创建这样的模型:

public class Customer
{
    public Customer()
    {
        BrokerageAccounts = new HashSet<BrokerageAccount>();
    }
    public int Id { get; set; }
    public string FirstName { get; set; }
    public ICollection<BrokerageAccount> BrokerageAccounts { get; set; }
}

public class BrokerageAccount
{

    public int Id { get; set; }
    public string AccountNumber { get; set; }
    public int CustomerId { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

什么是hashset在这里做什么?

我应该在前两个模型中使用hashset吗?

是否有任何文章显示hashset的应用?

Dan*_*iel 22

一般来说,最好使用最能表达您意图的集合.如果您不打算使用HashSet的独特特性,我就不会使用它.

它是无序的,不支持按索引查找.此外,它不像其他集合那样适合顺序读取,并且它允许您多次添加相同的项目而不创建重复项的事实仅在您有理由使用它时才有用.如果这不是您的意图,它可以隐藏行为不端的代码并使问题难以隔离.

HashSet主要用于插入和删除时间非常重要的情况,例如处理数据时.它对于使用intersect,except和union等操作来比较数据集(再次处理时)也非常有用.在任何其他情况下,缺点通常都超过专业人士.

考虑到使用博客文章时,插入和删除与读取相比非常少见,并且您通常希望以特定顺序读取数据.这或多或少与HashSet擅长的完全相反.由于任何原因,您打算两次添加相同的帖子是非常值得怀疑的,我认为没有理由在类似的类中对帖子使用基于集合的操作.


Jam*_*Ide 18

我是Entity Framework的新手,但这是我的理解.集合类型可以是任何实现的类型ICollection<T>.在我看来,HashSet通常是语义上正确的集合类型.大多数集合应该只有一个成员实例(没有重复),HashSet最好表达这一点.我一直在编写我的课程,如下所示,到目前为止一直运作良好.请注意,集合的类型为ISet<T>,并且setter是私有的.

public class Customer
{
    public Customer()
    {
        BrokerageAccounts = new HashSet<BrokerageAccount>();
    }
    public int Id { get; set; }
    public string FirstName { get; set; }
    public ISet<BrokerageAccount> BrokerageAccounts { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 我完全同意.在大多数情况下,`HashSet`*是最自然的选择. (2认同)

NER*_*808 18

HashSet不定义实际获取数据时将生成的集合类型.这将始终是声明的ICollection类型.

在构造函数中创建的HashSet是为了帮助您在没有记录被提取或存在于关系的许多方面时避免NullReferenceExceptions.这绝不是必需的.

例如,根据您的问题,当您尝试使用像...这样的关系时

var myCollection = Blog.Posts();
Run Code Online (Sandbox Code Playgroud)

如果没有帖子那么myCollection将是null.哪个是好的,直到你流畅地连结东西并做类似的事情

var myCollectionCount = Blog.Posts.Count();
Run Code Online (Sandbox Code Playgroud)

哪个会出错NullReferenceException.

在哪里

var myCollection = Customer.BrokerageAccounts();
var myCollectionCount = Customer.BrokerageAccounts.Count();
Run Code Online (Sandbox Code Playgroud)

将导致并清空ICollection和零计数.没有例外 :-)

  • 属性上的`()`是否有效(`Blog.Posts()`)?它不应该只是'Blog.Posts`访问该领域? (2认同)