EF Core-如何映射私有的自定义类型

时间:2018-12-17 01:40:03

标签: entity-framework-core domain-driven-design encapsulation ef-fluent-api

我想封装聚合的内部结构,但是现在,我可以调用Person.Address.Update()并能够直接修改该实体。

我想将Person.Address设为私有字段,并且不能从聚合根类外部访问。有人可以解释如何为Entity Framework Core进行流畅的API映射。地址在其自己的表中(与“人”一一对应)。我无法使其正常运行,也不想被当前的设计所困扰。

    public class Person : Entity, IAggregateRoot
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public Address Address { get; private set; }

    private Person() { }

    public Person(string firstName, string lastName, Address address)
    {
        FirstName = firstName;
        LastName = lastName;
        Address = address;
    }

    public void UpdateAddress(string streetName)
    {
        Address.Update(streetName);
    }
}

public class Address : Entity
{
    public string StreetName { get; private set; }

    private Address() { }

    public Address(string streetName)
    {
        StreetName = streetName;
    }

    public void Update(string streetName)
    {
        StreetName = streetName;
    }
}

1 个答案:

答案 0 :(得分:0)

我认为,通过UpdateAddress实现地址修改的方法是正确的。您的集合具有很多公开的业务方法,通过它们可以修改集合和被包围实体的整个状态。也许您可以找到比UpdateAddress更好的方法名称,因为“更新”似乎是技术细节,例如:AssignAddres,LocateAtAddress,AttachAddress。同样,还应从UpdateAddress方法中广播业务事件,例如:当聚合(+内部实体)的状态更改时,PersonaLocatedAtAddressEvent。