如何在Entity Framework 4中定义POCO中的集合?

6
假设我有一个包含零个或多个球员的“团队”类。
球员类很简单:
public class Player
{
    public long Id { get; set; }
    public string Name { get; set; }
    public Team Team { get; set; }
}

但是如何最好地定义Team类呢?

选项1

public class Team
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Player> Players { get; set; }
}

选项2:

public class Team
{
    public Team()
    {
        Players = new Collection<Player>();
    }

    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Player> Players { get; set; }
}

选项三:
public class Team
{
    public long Id { get; set; }
    public string Name { get; set; }
    public IQueryable<Player> Players { get; set; }
}

选项 4:

public class Team
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ObjectSet<Player> Players { get; set; }
}
1个回答

7
首先,让我们排除不可接受的选项。选项3并不正确;我们处于对象空间,而不是LINQ to Entities空间。选项4也不正确;ObjectSet用于在ObjectContext上使用,而不是在POCO类型上使用。
剩下的是1和2。它们都可以正常工作。如果您选择不这样做,Entity Framework将在从数据库实例化相关实例时初始化集合。然而,选项2具有优点,您可以在保存到数据库并读取回来之前在自己的代码中使用一个新的Team。所以我可能会选择那个。

有没有任何理由不使用Players = new Collection<Player>()而是使用Players = new List<Player>()?(因为Collection<T>主要是一个围绕着List<T>的外观包装类,但具有IsReadOnly检查。)至于选项2,那就是如果您使用默认的无参数构造函数创建一个new Team(),在使用它之前没有设置任何属性。然后是的,集合会被初始化,但实际上,我想象不出我什么时候会这样做。(虽然这是处理C# 9中的可空引用类型的一种方式。) - JohnB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接