从数据库中创建域对象的快速/正确方法

时间:2009-01-23 11:07:56

标签: c# database orm domain-driven-design

我在数据库中拥有像user,usergroup这样的典型表格,并且它们之间存在关系。

在我的域模型中,我希望如果您请求用户,您将获得用户,并且每个用户都拥有属性,这意味着这些是他所属的组。在属性中我想拥有组列表(类型安全为组)

另一方面应该这样做,这意味着每个组都应该知道哪些用户属于该组。

我有这些课程(例子):

public class User
{
    int Id { get; set; }
    string Name { get; set; }
    List<Usergroup> BelongsTo { get; set; }

    User()
    {
        BelongsTo = new List<Usergroup>();
    }
}

public class Usergroup
{
    int Id { get; set; }
    string Name { get; set; }
    List<User> Users { get; set; }

    Usergroup()
    {
        Users = new List<User>();
    }
}

internal class Relation
{
    int userId;
    int groupId;
}

现在,最好的方法是实现它,并且最快的方法是填充所有对象。

btw:我正在使用亚音速来获取所有数据库记录(每个表一个选择)。并且至少有1500个用户和30个组。

我当前的代码基于foreach over groups,relations.where for groups,然后users.singleordefault查找用户,然后将用户添加到组,将组添加到用户。但这需要大约30秒来完成。

我的客户端应用程序是一个webapp,所以我将结果存储在缓存的存储库中,这就是为什么我这样做!

2 个答案:

答案 0 :(得分:2)

  

我当前的代码基于foreach over groups,relations.where for groups,然后users.singleordefault查找用户,然后将用户添加到组,将组添加到用户。

我不明白你在这里说的是什么。

  

这需要大约30秒来执行此操作

鉴于只有1500名用户和30个小组,你所做的一切似乎太慢了。

  

现在,最好的方法是实现它,并且最快的方法是填充所有对象。

如果你想......

  • 所有用户,每个用户的群组
  • 或者,所有群组,每个群组的用户

...然后我建议从数据库中选择加入的记录。

然而,因为......

  • 您想要所有数据(双向加入)
  • 您只有1500条记录

...然后我建议您尽可能简单地选择所有内容,并加入您的应用程序。

//select users
Dictionary<int, User> users = new Dictionary<int, User>();
foreach (User user in selectUsersFromDatabase())
{
  users.Add(user.Id, user);
}
//select groups
Dictionary<int, Group> groups = new Dictionary<int, Group>();
foreach (Group group in selectGroupsFromDatabase())
{
  groups.Add(group.Id, group);
}
//select relations
//and join groups to users
//and join users to groups
foreach (Relation relation in selectRelationsFromDatabase())
{
  //find user in dictionary
  User user = users[relation.userId];
  //find group in dictionary
  Group group = groups[relation.groupId];
  //add group to user and add user to group
  user.BelongsTo.Add(group);
  group.Users.Add(user);
}

答案 1 :(得分:0)

最好的方法是仅检索客户端请求的实体,但允许该实体公开从数据库中检索其所有相关实体的方法。您不应该尝试从数据库中立即撤回所有内容,因为您不确定客户端是否需要此数据。

做这样的事情:

public class User
{
    int Id { get; set; }
    string Name { get; set; }

    public List<Usergroup> GetUserGroups()
    {
        // go and get the user groups
    }
}

如果您愿意,可以创建一个属性,将该值保存为User类的成员,并使用GetUserGroups方法为您延迟加载值。