【发布时间】:2018-03-11 17:45:30
【问题描述】:
我正在练习 DDD,我有一门课程,即所谓的 ValueObject。在Entity 中,我有该ValueObject 的自定义列表。我正在尝试将该集合保存为 JSON。
我有以下课程:
public class User : Entity
{
public string Username {get;set;}
private string _phoneNumbers = string.Empty;
public virtual PhoneList PhoneNumbers
{
get => (PhoneList)_phoneNumbers;
set => _phoneNumbers = value;
}
}
// A class to map the IList of PhoneNumber to string and vice versa
public class PhoneList : IEnumerable<PhoneNumber>
{
private IList<PhoneNumber> PhoneNumbers{ get; }
public PhoneList(IList<PhoneNumber> phoneNumbers)
{
PhoneNumbers = phoneNumbers;
}
public static explicit operator PhoneList(string phoneList)
{
var phoneNumbers = JsonConvert.DeserializeObject<IList<PhoneNumber>>(phoneList);
return new PhoneList(phoneNumbers);
}
public static implicit operator string(PhoneList phoneList)
{
return JsonConvert.SerializeObject(phoneList);
}
public IEnumerator<PhoneNumber> GetEnumerator()
{
return PhoneNumbers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class PhoneNumber : ValueObject
{
public string Number {get;set;}
protected override IEnumerable<object> GetAtomicValues()
{
yield return Number;
}
}
当我使用命令运行 EF Core 迁移工具时:Add-Migration InitialCreate
然后我得到以下错误:
错误:实体类型“PhoneNumber”需要定义主键。
重点是我不想为PhoneNumber 添加主键,因为它是ValueObject。
我也不明白为什么会在迁移中引发错误。
我该如何解决这个问题?
附言。我从this site得到这个想法
【问题讨论】:
-
抱歉,几分钟后就要回家了,所以只是简短的评论:你看过[Backing Fields]docs.microsoft.com/en-us/ef/core/modeling/backing-field吗?这应该允许您让您的电话有一个私有 id 变量(在对象之外无法访问),该变量可用于外键关系的字段。它只是将一些持久性泄漏到您的域中
标签: entity-framework domain-driven-design entity-framework-core value-objects