Использовать классы сущностей EF в WCF - PullRequest
0 голосов
/ 24 сентября 2011

Я создаю приложение на основе SOA, я создал WCF Service Project с использованием Framework 4.0, в котором я использую Entity Framework, в операции WCF. Метод Contract Я использую класс, сгенерированный EF, но WCF не может распознать эти объекты, когда я проверил эти классы в режиме конструктора, они похожи на

[EdmEntityTypeAttribute(NamespaceName="quizTestDBModel", Name="tbl_adminUser")]
    [Serializable()]
    [DataContractAttribute(IsReference=true)]
    public partial class tbl_adminUser : EntityObject
    {
        #region Factory Method

    /// <summary>
    /// Create a new tbl_adminUser object.
    /// </summary>
    /// <param name="adminUserId">Initial value of the adminUserId property.</param>
    public static tbl_adminUser Createtbl_adminUser(global::System.Int32 adminUserId, global::System.String name, global::System.String userid, global::System.String password)
    {
        tbl_adminUser tbl_adminUser = new tbl_adminUser();
        tbl_adminUser.adminUserId = adminUserId;
        return tbl_adminUser;
    }

    #endregion
    #region Primitive Properties

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 adminUserId
    {
        get
        {
            return _adminUserId;
        }
        set
        {
            if (_adminUserId != value)
            {
                OnadminUserIdChanging(value);
                ReportPropertyChanging("adminUserId");
                _adminUserId = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("adminUserId");
                OnadminUserIdChanged();
            }
        }
    }
    private global::System.Int32 _adminUserId;
    partial void OnadminUserIdChanging(global::System.Int32 value);
    partial void OnadminUserIdChanged();

    #endregion

}

Когда я использую этот класс в своем операционном контракте как

 int adminRegister(tbl_adminUser _adminUser);

В этом методе выдается ошибка: «Операция не поддерживается в тестовом клиенте WCF, поскольку он использует тип tbl_adminUser»

Спасибо

Ответы [ 2 ]

4 голосов
/ 25 сентября 2011

Если вы передаете специфичные для платформы данные через границу сервиса, значит, вы не используете SOA.

Классы Entity Framework специфичны для .NET и Entity Framework. Не передавайте их через границу обслуживания.

Я также отмечаю, что вы хотите подчинить своих клиентов вашим соглашениям об именах (tbl_adminUser), а также тому факту, что в них включены таблицы. Почему звонящие в ваш сервис должны знать что-либо о том, что вы реализовали концепцию «администратора», используя таблицу с именем tbl_adminUser?

Вы должны создать себе класс Data Transfer Object с именем, например, AdminUser. Он должен иметь свойства для всех интересных публичных аспектов пользователя-администратора (очевидно, просто AdminUserId). У него не должно быть никакого поведения - только данные.

Это класс, который должен быть отправлен и получен от вашего сервиса.

И, да, вам придется реализовать код отображения.

1 голос
/ 25 сентября 2011

Ошибка просто говорит о том, что тестовый клиент WCF не поддерживает ваш контракт, но это не значит, что сам WCF не поддерживает. Тестовый клиент WCF предназначен для тестирования наиболее распространенных сценариев и не поддерживает все функции WCF. Напишите тестовое приложение или используйте более мощный инструмент тестирования, такой как SoapUI, для проверки работоспособности вашего сервиса.

Также следуйте советам @ John, поскольку ваш текущий дизайн имеет ужасное соглашение об именах, он раскрывает сущности на основе EntityObject и далек от SOA. По твоему описанию это просто CRUD, выставленный как сервис. Вы добьетесь аналогичного результата с помощью WCD Data Services намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...