DDD 中的大集合使用 Entity Framework
Big collections in DDD using Entity Framework
我尝试使用 DDD 来描述域模型和代码优先方法,以使用 entity framework(使用流畅的 api)映射到数据库表。
例如,我有 2 个实体:俱乐部和用户。俱乐部有很多用户。我需要向俱乐部添加新用户。
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);
}
}
- 那么,我是否应该加载 Club 中的所有用户集合以添加新用户并保存?还是过分了?
- 对包含大量集合的实体进行建模的最佳方法是什么?我应该总是加载它们吗?或者移动到另一个单独的对象?
好吧,根据我从你的场景中可以看出的情况,为你的集合使用 virtual
关键字并让 Entity Framework 延迟加载你的集合
可能是有道理的
https://msdn.microsoft.com/en-gb/data/jj574232
基本上让 Entity Framework 为您完成工作
引入一个新的领域概念如何'Member'。 Member 可以是一个聚合体并且有他自己的专用 repo。或者您只需关闭原始设计的延迟加载并将其添加到其集合中。这完全取决于您的业务规则。
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 };
}
}
should I load all users collection in Club to add new and save?
不,您可以将新的 User
添加到 Club.Members
,EF 将保存新用户。没有必要先加载用户。
What is the best way for modeling entities with big collections
这不取决于集合的潜在大小,而是取决于您计划如何访问它们。如果有 Club
和成千上万的 Users
如果您想通过这样的查询来查询一小部分用户,则没有任何异议:
from c in Clubs
from u in c.Users
where c.Type = "Golf" && u.Membership = "Gold"
select u
我总是鼓励使用导航属性。 EF 实体模型首先用于访问数据库。 DDD 问题是次要的。
当然,除非您确实需要,否则您应该始终阻止加载俱乐部所有用户的查询。
我尝试使用 DDD 来描述域模型和代码优先方法,以使用 entity framework(使用流畅的 api)映射到数据库表。 例如,我有 2 个实体:俱乐部和用户。俱乐部有很多用户。我需要向俱乐部添加新用户。
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);
}
}
- 那么,我是否应该加载 Club 中的所有用户集合以添加新用户并保存?还是过分了?
- 对包含大量集合的实体进行建模的最佳方法是什么?我应该总是加载它们吗?或者移动到另一个单独的对象?
好吧,根据我从你的场景中可以看出的情况,为你的集合使用 virtual
关键字并让 Entity Framework 延迟加载你的集合
https://msdn.microsoft.com/en-gb/data/jj574232
基本上让 Entity Framework 为您完成工作
引入一个新的领域概念如何'Member'。 Member 可以是一个聚合体并且有他自己的专用 repo。或者您只需关闭原始设计的延迟加载并将其添加到其集合中。这完全取决于您的业务规则。
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 };
}
}
should I load all users collection in Club to add new and save?
不,您可以将新的 User
添加到 Club.Members
,EF 将保存新用户。没有必要先加载用户。
What is the best way for modeling entities with big collections
这不取决于集合的潜在大小,而是取决于您计划如何访问它们。如果有 Club
和成千上万的 Users
如果您想通过这样的查询来查询一小部分用户,则没有任何异议:
from c in Clubs
from u in c.Users
where c.Type = "Golf" && u.Membership = "Gold"
select u
我总是鼓励使用导航属性。 EF 实体模型首先用于访问数据库。 DDD 问题是次要的。
当然,除非您确实需要,否则您应该始终阻止加载俱乐部所有用户的查询。