Как управлять связями EF 4.2 в сценариях на основе WCF - PullRequest
4 голосов
/ 22 ноября 2011

Я работаю над корпоративным приложением, которое будет состоять из богатого клиента 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: Код пишется вручную прямо в это окно, а не фактически используемый код, поэтому, возможно, чего-то не хватает, но это не главное в моем вопросе, поэтому я надеюсь, что этого будет достаточно.

1 Ответ

1 голос
/ 22 ноября 2011

У меня есть похожее решение, в котором нам нужна целая куча операций типа CRUD, но наша модель данных не покидает сервер, мы сопоставляем объекты с отдельными DTO, используя autopper, эти DTO, как правило, являются классами WCF DatContract и не имеют много отношений как модель предметной области.

Поначалу это может показаться очень многословным подходом, но IMO это в конечном итоге окупается, потому что у вас есть много явного контроля над вашими интерфейсами, и во многих случаях вам действительно не нужно передавать всю модель предметной области (со всеми ее связями). ) клиенту клиент обычно может отображать только столько данных.

другой вариант может быть WCF DataServices, они будут использовать интерфейсы RESTful для передачи ваших данных.

[Новая опция]

еще одна опция, которую я использовал в прошлом, в основном только один метод обслуживания CRUD, который принимает байтовый массив. Используйте NetDataContractSerializer для сериализации / десериализации графов объектов в и из этих методов. Затем используйте пользовательский клиент, который передает данные туда и обратно, создает объекты и привязывает их к DataContext для выполнения операций .... что-то вроде это

...