0

Users可以有一个或多个Objects

可以Object与任意数量的 共享Users

目前我有:

public class Object
{
    [Required]
    [Key]
    public virtual int ObjectId { get; set; }
    public List<int> SharedWith { get; set; }
}

但这意味着为了找到与特定用户共享的那些对象,我必须执行以下操作:

var objects = new List<Object>();
foreach (Object object in _context.Objects)
{
    if (object.SharedWith.Contains(userId){ objects.Add(object) }
}

这似乎效率很低。对这种关系进行建模以便使上述查询更有效的正确方法是什么?

4

2 回答 2

3
public class Object
{
    public int ObjectID                    { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User
{
    public int UserID                          { get; set; }
    public virtual ICollection<Object> Objects { get; set; }
}

有了这两个navigation属性,Entity Framework 将为您处理多对多关系。

假设您userID存在于您的数据库中,您可以像这样查询,

var objects = _context.User
               .Include("Objects") // Eagerly load virtual collection
               .Where(q => q.UserID == userID)
               .First().Objects;
于 2013-06-22T00:44:29.670 回答
1

如果您在使用数据库优先策略时有过多对多关系,那么您可能熟悉这样一个事实,即当数据库连接表仅包含相关联的主键时,Entity Framework 可以创建多对多映射。实体。此映射规则与 Code First 相同,因此您还可以创建多对多关系,如下所示:

public class Object
{
    [Key]
    public int ObjectID{ get; set; }
    public List<User> Users { get; set; }
}

public class User
{
    [Key]
    public int UserID{ get; set; }
    public List<Object> Objects { get; set; }
}

然后是埃姆雷回答的第二部分。

于 2013-06-22T12:45:24.110 回答