【发布时间】:2017-09-12 17:38:27
【问题描述】:
我有一个项目,我按照 DDD 方法使用 Asp.Net Core 2.0。因此,我拥有拥有实体和值对象的聚合根,这些实体和值对象被配置为拥有类型,这是 EF Core 2.0 中的一项新功能。我添加了此类配置的示例以更好地说明。
域:
public class Address : ValueObject
{
public Address(string street, int number){
Street = street;
Number = number;
}
public string Street {get; private set;}
public int Number {get; private set;}
}
public class Company : AggregateRoot
{
public Address Address {get; private set;}
// Other properties...
// Value objects are immutables so I'm only able to replace it with a new object.
public void UpdateAddress(string street, int number){
Address = new Address(street, number);
}
// Other methods...
}
EF Core 实体配置:
internal class CompanyEntityTypeConfiguration : IEntityTypeConfiguration<Company>
{
public void Configure(EntityTypeBuilder<Company> builder)
{
builder.HasKey(x => x.Id);
builder.OwnsOne(x => x.Address);
}
}
我正在从数据库中检索一个跟踪实体,当我尝试更新 AggregateRoot 并用一个新值对象替换一个值对象时,我收到一个异常消息,指出“已经在跟踪另一个相同类型的实体”。地址是被跟踪的实体。
因此,解决方案是检索未跟踪但我不想使用这种方法,因为它会在数据库中进行完整更新。 那么,如何从 Entity Framework 2.0 跟踪的实体中更新值对象(拥有的实体)?
【问题讨论】:
-
不要替换旧的值对象,而是通过设置属性来修改它。
-
据我了解,框架不允许您将
Address设为Value object(不可变),并且必须是Entity(我的所有条款均来自 DDD 的观点) ,对吗? -
CodingYoshi:我相信是这样,但这会很糟糕,因为我的域将与框架耦合。 Constantin Galbenu:是的,我必须将我所有的价值对象都变成实体。
标签: c# domain-driven-design entity-framework-core .net-2.0