2

WCF データ サービス/OData/継承を機能させるためのトリックが欠けていると思います。簡単なテーブルをいくつか作成しました。

create table Super 
(
superID int IDENTITY(1,1) not null PRIMARY KEY, 
supername nvarchar(55),
)


create table sub
(
superID int not null,
extraData nvarchar(100),
FOREIGN KEY (superID) REFERENCES Super(superID)
)


insert Super values('abc')
insert Super values('def')
insert Super values('ghi')
insert Super values('jkl')
insert Super values('mno')


insert sub values(1, 'pqrstu')
insert sub values(3, 'vwxyz')

それらをedmxに取り込み、自動作成された関係を継承関係に置き換え、次を生成します。

namespace WebApplication3
{
#region Contexts

public partial class Entities : ObjectContext
    {        ....    }

#endregion

#region Entities

[EdmEntityTypeAttribute(NamespaceName="Model", Name="sub")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class sub : Super
    {
    #region Factory Method
    ...
    #endregion
    #region Primitive Properties

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
    [DataMemberAttribute()]
    public global::System.String extraData
    ...

    #endregion

    }


[EdmEntityTypeAttribute(NamespaceName="Model", Name="Super")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
[KnownTypeAttribute(typeof(sub))]
public partial class Super : EntityObject
    {
    #region Factory Method
    ...

    #endregion
    #region Primitive Properties


    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 superID
    ...


    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
    [DataMemberAttribute()]
    public global::System.String supername
    ...

    #endregion

    }

#endregion

}

V3 を使用するようにサービスをセットアップします。

namespace WebApplication3
    {
    public class WcfDs : DataService<Entities>
        {
        public static void InitializeService(DataServiceConfiguration config)
            {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
            }
        }
    }

Supers のクエリは正常に機能します。

http://localhost:8384/WcfDs.svc/Supers

派生型を取得するための無駄な試みで、多数の URL を試しました。

http://localhost:8384/WcfDs.svc/Supers/Model.sub/
http://localhost:8384/WcfDs.svc/Supers(1)/Model.sub/
http://localhost:8384/WcfDs.svc/Supers/WebApplication3.sub/
http://localhost:8384/WcfDs.svc/Supers(1)/WebApplication3.sub/
....

しかし、常に 404 Resource not found という応答が返されます。私は何が欠けていますか?

4

1 に答える 1

3

トリックは次のとおりです。

プロジェクトのプロパティで、Visual Studio 開発サーバーの使用からローカル IIS の使用に切り替えます。

少なくとも、これは私の VS 2010 環境では機能しました。

于 2013-05-29T10:54:42.193 に答える