Я работаю над корпоративным приложением, которое будет состоять из богатого клиента WPF, который обращается к группе веб-сервисов для получения данных. Эти данные являются POCO, созданными с помощью Code First EF 4.2.
Сейчас я столкнулся с концептуальной проблемой, которую пытался обернуть, но не смог найти хорошего решения.
1: n Ассоциаций
Итак, модель данных выглядит так:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> Children { get; set; }
}
Серверная часть У меня есть интерфейс, который заботится о присоединении вновь создаваемых dtos (включая новые элементы в детской коллекции) со стороны клиента к текстовому тексту и его сохранении. Это, конечно, работает, только если эти объекты создаются на стороне клиента, а затем отправляются для добавления. Служба добавляет новые сущности и возвращает обновленные сущности (главным образом, свойство Id) обратно.
[ServiceContract]
public interface IMyPersonCaretaker
{
[OperationContract]
Person CreatePerson(Person entity)
}
Однако, когда я получаю уже существующие объекты, я не могу редактировать любые ассоциации (добавлять или удалять объекты - потому что они имеют фиксированный размер). Поэтому теперь мне нужно расширить интерфейс, чтобы разрешить это:
[ServiceContract]
public interface IMyPersonCaretaker
{
[OperationContract]
Person CreatePerson(Person entity)
[OperationContract]
Person AddChild(Person parent, Person child)
}
Это кажется мне неуклюжим подходом, и интерфейсы становятся все больше и больше довольно быстро. Это сложный подход к работе с POCO? Как ты это делаешь?
n: m Ассоциации через ручное отображение
Другая часть модели данных выглядит следующим образом:
public class ClassA
{
public int Id { get; set; }
public virtual ICollection<AtoBMapping> Mappings { get; set; }
}
public class ClassB
{
public int Id { get; set; }
public virtual ICollection<AtoBMapping> Mappings { get; set; }
}
public class AtoBMapping
{
public int Id { get; set; }
public virtual ClassA A { get; set; }
public virtual ClassB B { get; set; }
}
Всякий раз, когда я пытаюсь создать экземпляр ClassA и ClassB на стороне клиента и добавить его друг к другу через привязку, я получаю ошибку, когда пытаюсь добавить его в Set в контексте. Ошибка говорит о том, что нельзя удалять элементы из свойства Mappings, и я не совсем понимаю, откуда это происходит.
Вторая часть может быть немного абстрактной, если кому-то нужна дополнительная информация, я с радостью ее добавлю!
PS: Пожалуйста, не предлагайте сущности Selftracking, я знаю о них, но мне было бы действительно интересно решение, основанное исключительно на POCO EF 4.2.
PPS: Код пишется вручную прямо в это окно, а не фактически используемый код, поэтому, возможно, чего-то не хватает, но это не главное в моем вопросе, поэтому я надеюсь, что этого будет достаточно.