顧客、会社、従業員などがContactInfoプロパティを持ち、そのプロパティに住所、電話、電子メールなどのセットが含まれているドメインについて考えてみます。
これが私の省略されたContactInfoです:
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の「ベストプラクティス」であるかどうかは100%わかりません):
- アドレスのコレクションは、遅延読み込みを可能にするために仮想的です
- コレクションのプライベートセッターはコレクションの交換を禁止しています
- コレクションは、
ISet
連絡先ごとに重複するアドレスがないことを保証するためのものです - 方法を使用
AddAddress
すると、プライマリであるアドレスが常に最大で1つあることを保証できます。
(可能であれば)メソッドを介してアドレスを追加しないようにし、 ...ContactInfo.Addresses.Add()
を強制的に使用したいです。ContactInfo.AddAddress(Address address)
を介してアドレスのセットを公開することを考えてReadOnlyCollection
いますが、これはEntity Framework(v5)で機能しますか?
どうすればいいですか?