如何将EF中的DDD值对象映射到不同的表?

问题描述 投票:2回答:2

我有以下课程:

public class Customer
{
    public int CustomerId { get; private set; }
    public string Name { get; private set; }
    public Address MailingAddress { get; private set; }
    public Address BillingAddress { get; private set; }
    public Address InvoiceAddress { get; private set; }
}

public class Address //this is a Value Object, with no Id
{
    public int CityID { get; private set; }
    public string Address { get; private set; }
    public string ZipCode { get; private set; }

    public virtual City City { get; private set; }
}

public class City
{
    public int CityID { get; private set; }
    public string Name { get; private set; }
}

假设域驱动设计中的值对象没有标识,我如何使用EF Code-First将上述场景映射到不同的表中?这种方法可行吗?

我真的不喜欢在同一个客户表上拥有不同地址的所有字段,但同时,我不想让我的域变脏对象Value Objects的身份。

c# entity-framework ef-code-first domain-driven-design
2个回答
3
投票

我同意你的看法,价值对象需要与实体对象不同的处理方式。毕竟,当两个人拥有相同的DOB时,我们不会存储这些人所指的一个日期对象。

但是,在我看来,映射到商店模型的类模型是not a domain model。如果你很幸运,它可能会接近,但它的主要职责是充当数据访问层。这些数据恰好与Codd这个词有关。

您要存储在关系数据库中的所有内容都必须具有标识。您的地址相同。由于您不希望它们成为Customer表的一部分(作为复合实体),因此您没有其他选择,只能将它们与身份存储在一个单独的表中。没那么糟糕。


1
投票

虽然在使用DDD时使用关系数据库并不是一个好主意,因为它在数据库中是冗余的,但是您可以通过将值对象指定为表中的主键来将DDD的值对象映射到单独的表中(没有其他选择)。

 public class AddressMapping : EntityTypeConfiguration<Address>
    {
        public AddressMapping()
        {
            HasKey(t => t.Address);
            Property(t => t.ZipCode); 
            // balh blah
        }
    }

value对象应该是不可变的,因此您应该将属性设置为模型中的私有集。注意:sql server不会让你在主键中持有更多15000个字符,因为你的主键是地址。所以你的值对象必须足够短,不仅仅是对主键的sql server限制。

© www.soinside.com 2019 - 2024. All rights reserved.