WCF DataService, как мне избежать [DataServiceKey] в POCO - PullRequest
7 голосов
/ 07 января 2011

Я использую WCF DataService и хочу использовать POCO. Я должен указать DataServiceKey, чтобы он работал (очевидно). Когда я делаю это, я должен ссылаться на System.Data.Services.Client (для System.Data.Services.Common) - что не очень POCO.

Есть ли способ содержать мои объекты в чистоте и указывать ключ где-нибудь еще?

1 Ответ

10 голосов
/ 11 января 2011

Если вы используете провайдер отражения и ваши классы не соблюдают соглашение по ключевым свойствам, тогда вы должны использовать атрибут DataServiceKey. Поставщик отражений - это тот, который вы получаете, если просто предоставляете определения класса и класс контекста для DataService. Поэтому, если вы не реализуете IDataServiceMetadataProvider, вы, скорее всего, используете провайдера отражений. Можно использовать поставщика отражения без атрибутов в ваших классах, но затем службы данных WCF применяют эвристику для определения ключевых свойств. Это выглядит так:

  • если рассматриваемый класс имеет свойство называется ID, это сущность с идентификатором в качестве единственного ключевого свойства.
  • если класс вызывается например Клиент и имеет свойство под названием CustomerID, это объект с Свойство CustomerID как единственный ключ свойство (имя класса очевидно, как образец).

Никакие другие свойства не распознаются как ключевые свойства без атрибута DataServiceKey. Это также описано, например, в этом блоге: http://blogs.msdn.com/b/alexj/archive/2010/06/11/tip-56-writing-an-odata-service-using-the-reflection-provider.aspx

Можно использовать 100% классы POCO с произвольными свойствами ключа, но тогда вам придется реализовать пользовательский поставщик. Это значительно больше работы, так как вы должны определить форму ваших классов программно. Пример пошагового руководства для нестандартного провайдера можно найти здесь: http://blogs.msdn.com/b/alexj/archive/2010/01/07/data-service-providers-getting-started.aspx

...