我不知道这 2 个选项中哪个最合适。
方案一:使用aggregateroot或者entity(聚合子实体)来映射表。
public class User : AggregateRoot
{
string Name { get; }
string Email { get; }
// Logic ...
}
现在配置 EF Core 实体:
public class EntityTypeConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
// ... map props.
}
}
选项 2:复制代码并创建 2 个具有自己作用域的类。
public class User : AggregateRoot
{
string Name { get; }
string Email { get; }
// Logic ...
}
public class UserTable
{
Guid Id { get; }
string Name { get; }
string Email { get; }
// No logic here ...
}
public class EntityTypeConfiguration : IEntityTypeConfiguration<UserTable>
{
public void Configure(EntityTypeBuilder<UserTable> builder)
{
// ... map props.
}
}
使用第二个选项,我可以将我的实体保存在同一个文件夹中,例如
EFCoreEntities
,代码应该更干净,但有很多重复的代码。
使用第二种方法,我必须在
UserTable
和User
之间编写额外的映射器(也许使用mapster / automapper)
例如,这将是
IUserRepository
,方法为:
// Here parameter is an User but have to map into UserTable
Add(User user)
{
var entity = user.MapToUserTable();
dbContext.Users.Add(entity)
// ...
}
您使用哪个选项,有什么优点和缺点?
我使用选项 2 单独的实体和域开发了一个相对较大的系统。
选项 2 的好处 ✅:
选项 2 缺点🔻:
我认为选项 1 的唯一缺点是一对多导航属性。例如,如果您使用集合导航属性的引用进行验证,并且忘记加载它们,则您的验证将默默失败,因为无法从域端知道您的实体已加载或未加载。这增加了域和持久性代码之间的耦合程度,并且域不应该关心持久性。
解决方案是
IEntityTypeConfiguration
启用自动加载。请记住,如果您决定启用延迟加载,请在任何“1-N 选择问题”发生时立即捕获它们。设置性能监控、集成和负载测试