DDD,如何使用NHibernate在子实体上持久删除



拥有AggregateRoot和子实体列表,在删除或更新其中一个子实体后,如何保持更新后的子实体列表?

这是一个应用层服务

async Task HandleAsync(RemoveChildRequest request)
{
Aggregate aggregate = await _aggregateRepository.GetByIdAsync(request.AggregateId);
aggregate.RemoveChild(request.ChildId);
await _aggregateRepository.Update(aggregate);
await _unitOfWork.CommitAsync();
}

这是删除子项的聚合方法。

public virtual void RemoveChild(Guid ChildId)
{
Child kid = _children.Single(item => item.Id == ChildId);
_children.Remove(kid);
}

这就是存储库聚合是应该的,具有相同的数据,但没有从集合中删除的子项。

Update(Aggregate aggregate)
{
await Session.UpdateAsync(aggregate, aggregate.Id);
}

这是我的NHibernate配置

mapping
.HasMany<Children>(Reveal.Member<Aggregate>("Children"))
.Not.Inverse()
.Not.KeyNullable()
.Not.KeyUpdate()
.Cascade.Delete();

提交完成后,就不会对数据库进行更新。不知怎么的,我觉得这很正常,因为我只从儿童收藏中删除了一个条目,仅此而已。

结构

Aggregate 
{
private virtual IList<Child> _children;
protected virtual List<Child> Children { get => _children; }
}
Child 
{
}

因此,只有父级拥有对子级的引用

我可以在聚合存储库中做这样的事情

RemoveChild(Child kid) 
{
Session.DeleteAsync(kid);
}

但据我所知,存储库应该只是特定于聚合的。

我感兴趣的是,实际将更改持久化到数据存储的代码是什么样子的?如何移除孩子。存储库。

在这里找到我的答案

nhibernate映射:具有级联="的集合;"全部删除孤立";不再引用

这里是

nhibernate 中的属性访问策略

NHibernate配置

mapping
.HasMany<Child>(Reveal.Member<Order>("Children"))
.Access.LowerCaseField(Prefix.Underscore)
.Cascade.AllDeleteOrphan()
.Not.KeyNullable()
.Not.KeyUpdate();

以下是使用ByCode映射的方法,重要的是colmap。Cascade(Cascade.All(。我希望这能有所帮助。

public class Client
{
public virtual int ClientId { get; protected set; }
public virtual string ClientName { get; protected set; }
public virtual IList<ClientLocation> ClientLocations { get; protected set; }
protected Client()
{
this.ClientLocations = new List<ClientLocation>();
}
}
public class ClientLocation
{
public virtual int ClientLocationId { get; protected set; }
public virtual Client Client { get; protected set; }
public virtual string LocationName { get; protected set; }
protected ClientBranch()
{
}
}

映射

public class ClientMap : ClassMapping<Client>
{        
public ClientMap() {
Lazy(true);
Id(x => x.ClientId, map => map.Generator(Generators.Identity));
Property(x => x.ClientName);
Bag(x => x.ClientLocations, colmap => { colmap.Key(x => x.Column("CLIENTID")); colmap.Cascade(Cascade.All); }, map => { map.OneToMany(); });
}
}

public class ClientLocationMap : ClassMapping<ClientLocation>
{
public ClientLocationMap()
{
Lazy(true);
Id(x => x.ClientLocationId, map => map.Generator(Generators.Identity));
Property(x => x.LocationName);
ManyToOne(x => x.Client, map => { map.Column("CLIENTID"); map.NotNullable(true); map.Cascade(Cascade.All); });
}
}

如果子实体属于聚合根(即组合而非关联(,则必须通过AggregateRoot而非独立地删除或添加子实体。此外,孩子应该是值对象,而不是自己的聚合。

因此,您是对的——Repository只会获取父级。然后,您将拥有RemoveChild命令,该命令将作用于该实例,并发布一个ChildRemoved事件,该事件将从列表中删除子级。

相关内容

  • 没有找到相关文章

最新更新