使用实体框架的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);
}
}
- 所以,我应该加载所有的用户收集在俱乐部添加新的和保存吗?还是过度了?
- 用大集合建模实体的最好方法是什么?我应该总是加载它们吗?或者将其移动到另一个单独的对象上?
我应该加载所有的用户收集在俱乐部添加新的和保存?
否,您可以添加新的User
到Club.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
关键字为你的集合,让实体框架惰性加载你的集合
基本上让实体框架为你做工作
引入一个新的域概念'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 };
}
}