Сервисы Wcf ria - пользовательские объекты с объектами EF - не могут скомпилироваться - PullRequest
0 голосов
/ 23 июня 2011

У меня есть пользовательский объект (не из модели объекта), у которого есть свойство, которое возвращает коллекцию объектов EF (из модели объекта):

[DataContract]
public class MyEntity
{

    [DataMember]
    public List<Role> Roles { get; set; }

}

Объекты 'Role' и 'RolePermission' генерируются EF4 из БД. RolePermission имеет FOREGIN_KEY для Role, и EF4 сгенерировал связь между Role и RolePermission:

Role.RolePermissions --navigate свойство RolePermission.Role --navigate свойство

Также у меня есть DomainService:

[EnableClientAccess()]
public class MyEntityService : DomainService
{

    public List<MyEntity> GetMyEntities()
    {
       ...
       myEntityInstance.Roles = <GetRoles>
       ...
       return <collection of MyEntities with Roles>
    }
}

Когда я пытаюсь скомпилировать это, я получаю ошибку:

Entity 'UserManager.Web.RolePermission' has a property 'RoleReference' with an unsupported type

Когда я помещаю атрибут [Include] в свойство MyEntity.Roles, я получаю ту же ошибку и эту ошибку:

Property 'Roles' of complex type 'MyEntity' is invalid. Complex types cannot have include members.  

когда я удалил ссылку из RolePermission в Role (свойство навигации RolePermission.Role) руками (из модели объекта), я получаю только эту ошибку во время компиляции:

The Entity 'Role' in DomainService 'RolesService' does not have a key defined. Entity types exposed by DomainService operations must have at least one public property marked with the KeyAttribute.

Как я могу разрешить эту ситуацию? Как я могу вернуть свой пользовательский объект (MyEntity) с заполненным свойством Roles из MyEntityService?

Добавлен [key] attr к Role.Metadata и успешная компиляция. Но у клиента нет свойства MyEntity.Roles.

1 Ответ

0 голосов
/ 23 июня 2011

Службы RIA требуют, чтобы все объекты, передаваемые между клиентом и сервером, имели уникальный ключ, чтобы он знал, какой конкретный объект вы изменяете.

Если вам нужен собственный объект в качестве оболочки для объектов EFпросто добавьте элемент id, помеченный [key], и сохраните это значение самостоятельно.

[DataContract]
public class MyEntity
{
    [key]
    public int Id { get; set; }

    [DataMember]
    public List<Role> Roles { get; set; }

}

Возможно, что-то не так с дизайном, если вам нужно это сделать.Кто является родителем группы ролей в вашем приложении?Почему бы не просто запросить роли?

...