0

Visual Studio 2013 を使用して、既存のデータベース上にエンティティ モデルを作成しました。各テーブルには、主キーの GUID があります。関連する OData バインディングとコントローラーを使用して MVC Web API プロジェクトを作成しました。

OData バインディングを作成する方法は次のとおりです。

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

builder.EntitySet<HRPosition>("HRPositions").EntityType.HasKey(p=>p.HTPositionGuid);

HRPositions エンティティのサンプル コントローラーを次に示します。

   public class HRPositionsController : ODataController
{
    private EFSEntities db = new EFSEntities();

    // GET: odata/HRPositions
    [EnableQuery]
    public IQueryable<HRPosition> GetHRPositions()
    {
        return db.HRPositions;
    }

    // GET: odata/HRPositions(5)
    [EnableQuery]
    public SingleResult<HRPosition> GetHRPosition([FromODataUri] Guid key)
    {
        return SingleResult.Create(db.HRPositions.Where(hRPosition => hRPosition.HTPositionGuid == key));
    }

    // PUT: odata/HRPositions(5)
    public async Task<IHttpActionResult> Put([FromODataUri] Guid key, Delta<HRPosition> patch)
    {
        Validate(patch.GetEntity());

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        HRPosition hRPosition = await db.HRPositions.FindAsync(key);
        if (hRPosition == null)
        {
            return NotFound();
        }

        patch.Put(hRPosition);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!HRPositionExists(key))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return Updated(hRPosition);
    }

    // POST: odata/HRPositions
    public async Task<IHttpActionResult> Post(HRPosition hRPosition)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.HRPositions.Add(hRPosition);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (HRPositionExists(hRPosition.HTPositionGuid))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return Created(hRPosition);
    }

    // PATCH: odata/HRPositions(5)
    [AcceptVerbs("PATCH", "MERGE")]
    public async Task<IHttpActionResult> Patch([FromODataUri] Guid key, Delta<HRPosition> patch)
    {
        Validate(patch.GetEntity());

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        HRPosition hRPosition = await db.HRPositions.FindAsync(key);
        if (hRPosition == null)
        {
            return NotFound();
        }

        patch.Patch(hRPosition);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!HRPositionExists(key))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return Updated(hRPosition);
    }

    // DELETE: odata/HRPositions(5)
    public async Task<IHttpActionResult> Delete([FromODataUri] Guid key)
    {
        HRPosition hRPosition = await db.HRPositions.FindAsync(key);
        if (hRPosition == null)
        {
            return NotFound();
        }

        db.HRPositions.Remove(hRPosition);
        await db.SaveChangesAsync();

        return StatusCode(HttpStatusCode.NoContent);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool HRPositionExists(Guid key)
    {
        return db.HRPositions.Count(e => e.HTPositionGuid == key) > 0;
    }
}

OData サービスがデプロイされ、Fiddler を使用すると、サービス エンドポイントにクエリを実行し、データの完全なリストと単一のエンティティ データを取得できます。

次に、OData サービスを参照して外部コンテンツ タイプを作成する SharePoint アプリを作成しました。これにより、各エンドポイントの ECT モデル定義が作成されます。

HRPositions の ECT は次のとおりです。

<?xml version="1.0" encoding="utf-16"?>
<Model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="EFSData" xmlns="http://schemas.microsoft.com/windows/2007/BusinessDataCatalog">
  <LobSystems>
    <LobSystem Name="EFSODATA" Type="OData">
      <Properties>
        <Property Name="ODataServiceMetadataUrl" Type="System.String">https://efsodataapi.azurewebsites.net/OData/$metadata</Property>
        <Property Name="ODataServiceMetadataAuthenticationMode" Type="System.String">PassThrough</Property>
        <Property Name="ODataServicesVersion" Type="System.String">2.0</Property>
      </Properties>
      <AccessControlList>
        <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
          <Right BdcRight="Edit" />
          <Right BdcRight="Execute" />
          <Right BdcRight="SelectableInClients" />
          <Right BdcRight="SetPermissions" />
        </AccessControlEntry>
      </AccessControlList>
      <LobSystemInstances>
        <LobSystemInstance Name="EFSODATA">
          <Properties>
            <Property Name="ODataServiceUrl" Type="System.String">https://efsodataapi.azurewebsites.net/OData</Property>
            <Property Name="ODataServiceAuthenticationMode" Type="System.String">PassThrough</Property>
            <Property Name="ODataFormat" Type="System.String">application/atom+xml</Property>
            <Property Name="HttpHeaderSetAcceptLanguage" Type="System.Boolean">true</Property>
          </Properties>
        </LobSystemInstance>
      </LobSystemInstances>
      <Entities>
        <Entity Name="HRPositions" DefaultDisplayName="HRPositions" Namespace="EFSData" Version="1.0.0.0" EstimatedInstanceCount="2000">
          <Properties>
            <Property Name="ExcludeFromOfflineClientForList" Type="System.String">False</Property>
          </Properties>
          <AccessControlList>
            <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
              <Right BdcRight="Edit" />
              <Right BdcRight="Execute" />
              <Right BdcRight="SelectableInClients" />
              <Right BdcRight="SetPermissions" />
            </AccessControlEntry>
          </AccessControlList>
          <Identifiers>
            <Identifier Name="HTPositionGuid" TypeName="System.Guid" />
          </Identifiers>
          <Methods>
            <Method Name="CreateHRPosition" DefaultDisplayName="Create HRPosition" IsStatic="false">
              <Properties>
                <Property Name="ODataEntityUrl" Type="System.String">/HRPositions</Property>
              </Properties>
              <AccessControlList>
                <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                  <Right BdcRight="Edit" />
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SelectableInClients" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
              <Parameters>
                <Parameter Name="@HTPositionGuid" Direction="In">
                  <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" CreatorField="true" />
                </Parameter>
                <Parameter Name="@PosistionCode" Direction="In">
                  <TypeDescriptor Name="PosistionCode" DefaultDisplayName="PosistionCode" TypeName="System.String" CreatorField="true" />
                </Parameter>
                <Parameter Name="@PositionName" Direction="In">
                  <TypeDescriptor Name="PositionName" DefaultDisplayName="PositionName" TypeName="System.String" CreatorField="true" />
                </Parameter>
                <Parameter Name="@Description" Direction="In">
                  <TypeDescriptor Name="Description" DefaultDisplayName="Description" TypeName="System.String" CreatorField="true" />
                </Parameter>
                <Parameter Name="@CreateHRPosition" Direction="Return">
                  <TypeDescriptor Name="CreateHRPosition" DefaultDisplayName="CreateHRPosition" TypeName="Microsoft.BusinessData.Runtime.DynamicType">
                    <TypeDescriptors>
                      <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" ReadOnly="true" />
                      <TypeDescriptor Name="PosistionCode" DefaultDisplayName="PosistionCode" TypeName="System.String" />
                      <TypeDescriptor Name="PositionName" DefaultDisplayName="PositionName" TypeName="System.String" />
                      <TypeDescriptor Name="Description" DefaultDisplayName="Description" TypeName="System.String" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="CreateHRPosition" Type="Creator" ReturnParameterName="@CreateHRPosition" ReturnTypeDescriptorPath="CreateHRPosition">
                  <AccessControlList>
                    <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                      <Right BdcRight="Edit" />
                      <Right BdcRight="Execute" />
                      <Right BdcRight="SelectableInClients" />
                      <Right BdcRight="SetPermissions" />
                    </AccessControlEntry>
                  </AccessControlList>
                </MethodInstance>
              </MethodInstances>
            </Method>
            <Method Name="ReadSpecificHRPosition" DefaultDisplayName="Read Specific HRPosition" IsStatic="false">
              <Properties>
                <Property Name="ODataEntityUrl" Type="System.String">/HRPositions(HTPositionGuid=guid'@HTPositionGuid')</Property>
              </Properties>
              <AccessControlList>
                <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                  <Right BdcRight="Edit" />
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SelectableInClients" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
              <Parameters>
                <Parameter Name="@HTPositionGuid" Direction="In">
                  <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" />
                </Parameter>
                <Parameter Name="@HRPosition" Direction="Return">
                  <TypeDescriptor Name="HRPosition" DefaultDisplayName="HRPosition" TypeName="Microsoft.BusinessData.Runtime.DynamicType">
                    <TypeDescriptors>
                      <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" ReadOnly="true" />
                      <TypeDescriptor Name="PosistionCode" DefaultDisplayName="PosistionCode" TypeName="System.String" />
                      <TypeDescriptor Name="PositionName" DefaultDisplayName="PositionName" TypeName="System.String" />
                      <TypeDescriptor Name="Description" DefaultDisplayName="Description" TypeName="System.String" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="ReadSpecificHRPosition" Type="SpecificFinder" Default="true" ReturnParameterName="@HRPosition" ReturnTypeDescriptorPath="HRPosition">
                  <AccessControlList>
                    <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                      <Right BdcRight="Edit" />
                      <Right BdcRight="Execute" />
                      <Right BdcRight="SelectableInClients" />
                      <Right BdcRight="SetPermissions" />
                    </AccessControlEntry>
                  </AccessControlList>
                </MethodInstance>
              </MethodInstances>
            </Method>
            <Method Name="ReadAllHRPosition" DefaultDisplayName="Read All HRPosition" IsStatic="false">
              <Properties>
                <Property Name="ODataEntityUrl" Type="System.String">/HRPositions?$top=@LimitHRPositionss</Property>
              </Properties>
              <AccessControlList>
                <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                  <Right BdcRight="Edit" />
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SelectableInClients" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
              <FilterDescriptors>
                <FilterDescriptor Name="LimitFilter" DefaultDisplayName="LimitFilter" Type="Limit" />
              </FilterDescriptors>
              <Parameters>
                <Parameter Name="@LimitHRPositionss" Direction="In">
                  <TypeDescriptor Name="LimitHRPositionss" DefaultDisplayName="LimitHRPositionss" TypeName="System.Int32" AssociatedFilter="LimitFilter">
                    <Properties>
                      <Property Name="LogicalOperatorWithPrevious" Type="System.String">None</Property>
                      <Property Name="Order" Type="System.String">0</Property>
                    </Properties>
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="ReadAllHRPosition" Type="System.Int32">100</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Name="@HRPositions" Direction="Return">
                  <TypeDescriptor Name="HRPositions" DefaultDisplayName="HRPositions" TypeName="Microsoft.BusinessData.Runtime.IDynamicTypeEnumerator" IsCollection="true">
                    <TypeDescriptors>
                      <TypeDescriptor Name="HRPosition" DefaultDisplayName="HRPosition" TypeName="Microsoft.BusinessData.Runtime.DynamicType">
                        <TypeDescriptors>
                          <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" ReadOnly="true" />
                          <TypeDescriptor Name="PosistionCode" DefaultDisplayName="PosistionCode" TypeName="System.String" />
                          <TypeDescriptor Name="PositionName" DefaultDisplayName="PositionName" TypeName="System.String" />
                          <TypeDescriptor Name="Description" DefaultDisplayName="Description" TypeName="System.String" />
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="ReadAllHRPosition" Type="Finder" Default="true" ReturnParameterName="@HRPositions" ReturnTypeDescriptorPath="HRPositions">
                  <AccessControlList>
                    <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                      <Right BdcRight="Edit" />
                      <Right BdcRight="Execute" />
                      <Right BdcRight="SelectableInClients" />
                      <Right BdcRight="SetPermissions" />
                    </AccessControlEntry>
                  </AccessControlList>
                </MethodInstance>
              </MethodInstances>
            </Method>
            <Method Name="UpdateHRPosition" DefaultDisplayName="Update HRPosition" IsStatic="false">
              <Properties>
                <Property Name="ODataEntityUrl" Type="System.String">/HRPositions(HTPositionGuid=guid'@HTPositionGuid')</Property>
              </Properties>
              <AccessControlList>
                <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                  <Right BdcRight="Edit" />
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SelectableInClients" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
              <Parameters>
                <Parameter Name="@HTPositionGuid" Direction="In">
                  <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" UpdaterField="true" />
                </Parameter>
                <Parameter Name="@PosistionCode" Direction="In">
                  <TypeDescriptor Name="PosistionCode" DefaultDisplayName="PosistionCode" TypeName="System.String" UpdaterField="true" />
                </Parameter>
                <Parameter Name="@PositionName" Direction="In">
                  <TypeDescriptor Name="PositionName" DefaultDisplayName="PositionName" TypeName="System.String" UpdaterField="true" />
                </Parameter>
                <Parameter Name="@Description" Direction="In">
                  <TypeDescriptor Name="Description" DefaultDisplayName="Description" TypeName="System.String" UpdaterField="true" />
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="UpdateHRPosition" Type="Updater">
                  <AccessControlList>
                    <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                      <Right BdcRight="Edit" />
                      <Right BdcRight="Execute" />
                      <Right BdcRight="SelectableInClients" />
                      <Right BdcRight="SetPermissions" />
                    </AccessControlEntry>
                  </AccessControlList>
                </MethodInstance>
              </MethodInstances>
            </Method>
            <Method Name="DeleteHRPosition" DefaultDisplayName="Delete HRPosition" IsStatic="false">
              <Properties>
                <Property Name="ODataEntityUrl" Type="System.String">/HRPositions(HTPositionGuid=guid'@HTPositionGuid')</Property>
              </Properties>
              <AccessControlList>
                <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                  <Right BdcRight="Edit" />
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SelectableInClients" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
              <Parameters>
                <Parameter Name="@HTPositionGuid" Direction="In">
                  <TypeDescriptor Name="HTPositionGuid" DefaultDisplayName="HTPositionGuid" TypeName="System.Guid" IdentifierName="HTPositionGuid" />
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="DeleteHRPosition" Type="Deleter">
                  <AccessControlList>
                    <AccessControlEntry Principal="STS|SecurityTokenService|http://sharepoint.microsoft.com/claims/2009/08/isauthenticated|true|http://www.w3.org/2001/XMLSchema#string">
                      <Right BdcRight="Edit" />
                      <Right BdcRight="Execute" />
                      <Right BdcRight="SelectableInClients" />
                      <Right BdcRight="SetPermissions" />
                    </AccessControlEntry>
                  </AccessControlList>
                </MethodInstance>
              </MethodInstances>
            </Method>
          </Methods>
        </Entity>
      </Entities>
    </LobSystem>
  </LobSystems>
</Model>

ECT を SharePoint Online BCS にアップロードしましたが、すべて問題ないようです。

ここに画像の説明を入力

そこから外部リストを作成し、HRPositions ECT を参照します。これにより、SP リストが作成されますが、主キー (GUID) がありません。

ここに画像の説明を入力

このビューには適切なデータが表示されます。 ここに画像の説明を入力

リストに新しいアイテムを追加できます。 ここに画像の説明を入力

そして、それはすべての読み取りビューに表示されます。 ここに画像の説明を入力

ただし、操作ごとにこのエラーが発生するため、リスト項目を編集、削除、または表示することはできません。 ここに画像の説明を入力

OData Web サービスにアタッチすると、問題が発生している理由を確認できました。OData サービスから反映された Visual Studio 内の自動生成された外部コントロール タイプ (ECT) には、何らかの理由で /HRPositions(HTPositionGuid=guid'@HTPositionGuid'); として要求を定式化するという問題があることが判明しました。

ここに画像の説明を入力

実際には /HRPositions(guid'@HTPositionGuid'); のみである必要があります。

パラメータリスト内に HTPositionGuid= が含まれている理由を誰か教えてもらえますか?

エンティティごとにコード生成された ECT ファイルを手動で編集できますが、それはばかげているようです。

4

0 に答える 0