考虑一个领域,其中客户、公司、员工等都有“联系信息”属性,该属性包含一组地址、电话、电子邮件等等。
这是我的简化联系信息:
这是我的简化联系信息:
public class ContactInfo : Entity<int>
{
public ContactInfo()
{
Addresses = new HashSet<Address>();
}
public virtual ISet<Address> Addresses { get ; private set; }
public Address PrimaryAddress
{
get { return Addresses.FirstOrDefault(a => a.IsPrimary); }
}
public bool AddAddress(Address address)
{
// insure there is only one primary address in collection
if (address.IsPrimary)
{
if (PrimaryAddress != null)
{
PrimaryAddress.IsPrimary = false;
}
}
else
{
// make sure the only address in collection is primary
if (!Addresses.Any())
{
address.IsPrimary = true;
}
}
return Addresses.Add(address);
}
}
以下是一些笔记(我不确定这是否是EF的最佳实践):
- 地址集合(collection of Address(es))是虚拟的,以实现延迟加载。
- 集合的私有设置器(private setter on collection)禁止替换集合。
- 集合是一个
ISet
,以确保每个联系人没有重复的地址。 - 使用
AddAddress
方法,我可以确保始终至多只有一个主要地址....
如果可能的话,我想防止通过ContactInfo.Addresses.Add()
方法添加地址,并强制使用ContactInfo.AddAddress(Address address)
方法...
我在考虑通过ReadOnlyCollection
来公开地址集合,但这样做对于Entity Framework(v5)是否可行?
如何去做呢?