使用实体框架的DDD中的大集合

本文关键字:集合 DDD 实体 框架 | 更新日期: 2023-09-27 17:53:41

我尝试使用DDD来描述域模型和代码优先方法,通过实体框架(使用fluent api)映射到数据库表。例如,我有两个实体:俱乐部和用户。俱乐部有很多用户。我需要添加新的用户到俱乐部。

class User 
{
    public string Name { get; set; }
    public Club Club { get; set; }
}
class Club
{
    public string ClubName { get; set; }
    public ICollection<User> Members { get; set; }
    public void AddNewMember(User user)
    {
        //..some logic and checks
        Members.Add(user);
    }
}
    所以,我应该加载所有的用户收集在俱乐部添加新的和保存吗?还是过度了?
  1. 用大集合建模实体的最好方法是什么?我应该总是加载它们吗?或者将其移动到另一个单独的对象上?

使用实体框架的DDD中的大集合

我应该加载所有的用户收集在俱乐部添加新的和保存?

否,您可以添加新的UserClub.Members, EF将保存新用户。没有必要先加载用户

用大集合建模实体的最好方法是什么

这并不取决于集合的潜在大小,而是取决于您计划如何访问它们。如果存在Club s和数千个Users,那么如果您想通过以下查询查询一小部分用户,则没有任何异议:

from c in Clubs
from u in c.Users
where c.Type = "Golf" && u.Membership = "Gold"
select u
我总是鼓励使用导航属性。EF实体模型首先用于访问数据库。DDD问题是次要的。

当然,除非您确实需要,否则您可能应该始终阻止加载一个俱乐部的所有用户的查询。

这可能是有意义的,根据我从你的场景中可以看出,使用virtual关键字为你的集合,让实体框架惰性加载你的集合

https://msdn.microsoft.com/en-gb/data/jj574232

基本上让实体框架为你做工作

引入一个新的域概念'Member'如何?成员可以是一个集合,并有自己的专用回购。或者您只需关闭原始设计的延迟加载并将其添加到其集合中。这完全取决于您的业务规则。

public class User
{
    public Guid UserId { get; set; }
}
public class Member
{
    public Guid ClubId { get; set; }
    public Guid UserId { get; set; }
}
public class Club
{
    public Guid ClubId { get; set; }
    public Member RegisterMember(User user)
    {
        // Check business rules..
        return new Member { UserId = user.Id, ClubId = this.ClubId };
    }
}