Я нашел ответ на свой вопрос 2:
Свойство ассоциации Contacts
не включено в создаваемые типы объектов службы домена.Вы должны указать атрибут [Include]
для их включения.Однако для атрибута include требуется атрибут [Association]
.Вы не можете указать атрибут [Association]
, потому что это отношение «многие ко многим», а для атрибута ассоциации требуется указать внешние ключи.
Решение состоит в том, чтобы обернуть ваши объекты в объект передачи данных (DTO).Мне не нужно было вносить серьезные изменения в код, который уже был в моем вопросе.Единственное, что изменилось, это поиск Заказчика в классе обслуживания домена:
public CustomerDTO GetCustomerById(int Id)
{
return new CustomerDTO(this.ObjectContext.Customers.Include("Contacts").SingleOrDefault(s => s.Id == Id));
}
Основная часть решения заключалась в том, чтобы внести изменения в классы DTO в базовую модель структуры сущности:
[DataContract]
public partial class CustomerDTO : Customer
{
public CustomerDTO() { }
public CustomerDTO(Customer customer)
{
if (customer != null)
{
Id = customer.Id;
Name = customer.Name;
CustomerContacts = new Collection<ContactDTO>();
foreach (Contact d in customer.Contacts)
{
CustomerContacts.Add(new ContactDTO(d, Id));
}
}
}
[DataMember]
[Include]
[Association("CustomerContacts", "CustomerId", "Id")]
public Collection<ContactDTO> CustomerContacts
{
get;
set;
}
}
[KnownType(typeof(CustomerDTO))]
public partial class Customer
{
}
[DataContract()]
public partial class ContactDTO : Contact
{
public ContactDTO() { }
public ContactDTO(Contact contact, int customerId)
{
if (contact != null)
{
Id = contact.Id;
FullName = contact.FullName;
CustomerId = customerId;
}
}
[DataMember]
public int CustomerId { get; set; }
}
[KnownType(typeof(ContactDTO))]
public partial class Contact
{
}
Атрибуты KnownType
, DataMember
и DataContract
были необходимы для того, чтобы это работало.В действительности создание экземпляров объектов потребует немного большего копирования свойств в конструкторах.Есть ли простой способ избежать кода, который делает явную копию?Я открыт для предложений.
Я надеялся избежать введения дополнительных классов, но это кажется неизбежным в случае отношения «многие ко многим» из-за обязательного атрибута Association
, которому нужен внешний ключСпецификация;в моем случае Contact.CustomerId
.
Кто-нибудь может сделать лучше (== меньше кода)?