Ошибка развертывания решения SharePoint 2010 - невозможно создать более 500 объектов IEntity на один объект ILobSystem

Я генерирую XML-файл модели BDC sharepoint 2010 вместе с сущностями и связанными классами обслуживания из модели 1st LLBLGen framework/ C# .net 3.5. Все шло хорошо, когда я внезапно начал получать эту ошибку при развертывании решения BDC;

"Ошибка 178 Произошла ошибка на этапе развертывания" Добавить решение ": невозможно создать более 500 объектов IEntity на один объект ILobSystem ".

Он был развернут нормально (после изменения реестра, чтобы расширить настройки тайм-аута) с текущим числом объектов. Я не могу найти ссылки на ограничения объектов IEntity ни в MSDN, ни через Google, и попытался изменить сгенерированный XML-файл различными способами для тестирования. Если я удаляю объект, ошибка переходит к началу следующего объекта. Visual Studio строит решение просто отлично, только с предупреждениями о типе даты и времени (очевидно, известная проблема).

У меня есть только 59 объектов. Некоторые из них находятся в иерархиях наследования, и в модели представлены многочисленные отношения FK. Для меня не имеет никакого смысла, что в моей модели слишком много сущностей. У меня есть еще кое-что, что я хотел бы добавить. Я включаю EstimatedInstanceCount="10000" на каждую сущность, но это, похоже, ничего не влияет. На самом деле я считаю, что это по умолчанию. Файл модели довольно большой, но я включу следующий фрагмент сущности для ссылки на то, какой код генерируется.

<Entity Name="Load" Namespace="SharePoint.DataConnector.VoyagerModel" EstimatedInstanceCount="10000" Version="1.0.0.26">
    <Properties>
        <Property Name="Class" Type="System.String">SharePoint.DataConnector.VoyagerModel.LoadService, VoyagerModel</Property>
    </Properties>
    <Identifiers>
        <Identifier Name="Id" TypeName="System.Int32" />
        <!-- TODO: Change the name of the ID and if needed the TypeName of your identifier. -->
    </Identifiers>
    <Methods>
        <!-- start finder method -->
        <Method Name="ReadList">
        <!-- TODO: Change the name of the method if needed. -->
            <Parameters>
                <Parameter Direction="Return" Name="returnParameter">
                <TypeDescriptor TypeName="System.Collections.Generic.IEnumerable`1[[SharePoint.DataConnector.VoyagerModel.Load, VoyagerModel]]" IsCollection="true" Name="LoadList">
                    <TypeDescriptors>
                    <TypeDescriptor Name="Load" TypeName="SharePoint.DataConnector.VoyagerModel.Load, VoyagerModel">
                        <TypeDescriptors>
                            <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierName="Id" IsCollection="false" ReadOnly="false" />
                            <!-- TODO: Add TypeDescriptors when you add properties to Load. -->                         
                            <TypeDescriptor Name="OrderId" IsCollection="false" ReadOnly="false" TypeName="System.Int32" />
                            <TypeDescriptor Name="Status" IsCollection="false" ReadOnly="false" TypeName="System.String" />
                            <TypeDescriptor Name="DriverId" TypeName="System.Int32" IdentifierEntityName="Driver" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" IsCollection="false" />
                        </TypeDescriptors>
                    </TypeDescriptor>
                    </TypeDescriptors>
                </TypeDescriptor>
                </Parameter>
            </Parameters>
            <MethodInstances>
                <MethodInstance Type="Finder" ReturnParameterName="returnParameter" Default="true" Name="ReadList" DefaultDisplayName="Load List">
                <Properties>
                    <Property Name="RootFinder" Type="System.String">x</Property>
                </Properties>
                </MethodInstance>
            </MethodInstances>
        </Method>
        <!-- end finder method -->
        <!-- start specific finder method -->
        <Method Name="ReadItem">
            <Parameters>
                <Parameter Direction="In" Name="id">
                    <TypeDescriptor TypeName="System.Int32" IdentifierName="Id" Name="Id" IsCollection="false" />
                </Parameter>
                    <Parameter Direction="Return" Name="returnParameter">
                    <TypeDescriptor TypeName="SharePoint.DataConnector.VoyagerModel.Load, VoyagerModel" Name="Load">
                        <TypeDescriptors>
                            <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierName="Id" IsCollection="false" ReadOnly="false" />
                            <!-- TODO: Add TypeDescriptors when you add properties to Load. -->
                            <TypeDescriptor Name="OrderId" TypeName="System.Int32" IsCollection="false" />
                            <TypeDescriptor Name="Status" TypeName="System.String" IsCollection="false" />
                            <TypeDescriptor Name="DriverId" TypeName="System.Int32" IdentifierEntityName="Driver" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" IsCollection="false" />
                        </TypeDescriptors>
                    </TypeDescriptor>
                </Parameter>
            </Parameters>
            <MethodInstances>
                <MethodInstance Type="SpecificFinder" ReturnParameterName="returnParameter" Default="true" Name="ReadItem" DefaultDisplayName="Read Load" />
            </MethodInstances>
        </Method>
        <Method Name="Create">
            <Parameters>
                <Parameter Name="returnLoad" Direction="Return">
                    <TypeDescriptor Name="ReturnLoad" TypeName="SharePoint.DataConnector.VoyagerModel.Load, VoyagerModel">
                        <TypeDescriptors>
                            <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierName="Id" IsCollection="false" ReadOnly="false" />
                            <TypeDescriptor Name="OrderId" TypeName="System.Int32" IsCollection="false" />                      
                            <TypeDescriptor Name="Status" TypeName="System.String" IsCollection="false" />                      
                            <TypeDescriptor Name="DriverId" TypeName="System.Int32" IdentifierEntityName="Driver" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" IsCollection="false" />
                        </TypeDescriptors>
                    </TypeDescriptor>
                </Parameter>
                <Parameter Name="newLoad" Direction="In">
                    <TypeDescriptor Name="NewLoad" TypeName="SharePoint.DataConnector.VoyagerModel.Load, VoyagerModel">
                        <TypeDescriptors>
                            <TypeDescriptor Name="Id" IdentifierName="Id" IsCollection="false" ReadOnly="false" TypeName="System.Int32" CreatorField="false" />
                            <TypeDescriptor Name="OrderId" TypeName="System.Int32" IsCollection="false" CreatorField="true" />                      
                            <TypeDescriptor Name="Status" TypeName="System.String" IsCollection="false" CreatorField="true" />                      
                            <TypeDescriptor Name="DriverId" TypeName="System.Int32" IdentifierEntityName="Driver" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" IsCollection="false" />
                        </TypeDescriptors>
                    </TypeDescriptor>
                </Parameter>
            </Parameters>
            <MethodInstances>
                <MethodInstance Name="Create" Type="Creator" ReturnParameterName="returnLoad" ReturnTypeDescriptorPath="ReturnLoad" />
            </MethodInstances>
        </Method>
        <Method Name="Delete">
            <Parameters>
                <Parameter Name="id" Direction="In">
                    <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierEntityName="Load" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" />
                </Parameter>
            </Parameters>
            <MethodInstances>
                <MethodInstance Name="Delete" Type="Deleter" />
            </MethodInstances>
        </Method>
        <Method Name="Update">
            <Parameters>
                <Parameter Name="Load" Direction="In">
                    <TypeDescriptor Name="Load" TypeName="SharePoint.DataConnector.VoyagerModel.Load, VoyagerModel">
                        <TypeDescriptors>
                            <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierName="Id" IsCollection="false" ReadOnly="false" />
                            <TypeDescriptor Name="OrderId" TypeName="System.Int32" IsCollection="false" UpdaterField="true" />
                            <TypeDescriptor Name="Status" TypeName="System.String" IsCollection="false" UpdaterField="true" />
                            <TypeDescriptor Name="DriverId" TypeName="System.Int32" IdentifierEntityName="Driver" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" IsCollection="false" />
                        </TypeDescriptors>
                    </TypeDescriptor>
                </Parameter>
            </Parameters>
            <MethodInstances>
                <MethodInstance Name="Update" Type="Updater" />
            </MethodInstances>
        </Method>
        <!-- start related entity methods -->

        <Method Name="LoadToOrders">
            <Parameters>
                    <Parameter Name="id" Direction="In">
                        <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierEntityName="Load" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" ForeignIdentifierAssociationEntityName="Load" ForeignIdentifierAssociationEntityNamespace="SharePoint.DataConnector.VoyagerModel" ForeignIdentifierAssociationName="LoadToOrdersAssociationNavigator" />
                    </Parameter>
                    <Parameter Name="orderList" Direction="Return">
                        <TypeDescriptor Name="OrderList" TypeName="System.Collections.Generic.IEnumerable`1[[SharePoint.DataConnector.VoyagerModel.Order, VoyagerModel]]" IsCollection="true">
                            <TypeDescriptors>
                                <TypeDescriptor Name="Order" TypeName="SharePoint.DataConnector.VoyagerModel.Order, VoyagerModel">
                                    <TypeDescriptors>
                                        <TypeDescriptor Name="Id" IsCollection="false" ReadOnly="true" TypeName="System.Int32" IdentifierEntityName="Order" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" />
                                    </TypeDescriptors>
                                </TypeDescriptor>
                            </TypeDescriptors>
                        </TypeDescriptor>
                    </Parameter>
            </Parameters>
            <MethodInstances>
                    <Association Name="LoadToOrdersAssociationNavigator" Type="AssociationNavigator" ReturnParameterName="orderList" ReturnTypeDescriptorPath="OrderList">
                        <SourceEntity Name="Load" Namespace="SharePoint.DataConnector.VoyagerModel" />
                        <DestinationEntity Name="Order" Namespace="SharePoint.DataConnector.VoyagerModel" />
                    </Association>
            </MethodInstances>
        </Method>

        <Method Name="LoadToDriver">
            <Parameters>
                <Parameter Name="id" Direction="In">
                    <TypeDescriptor Name="Id" TypeName="System.Int32" IdentifierEntityName="Load" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" ForeignIdentifierAssociationEntityName="Load" ForeignIdentifierAssociationEntityNamespace="SharePoint.DataConnector.VoyagerModel" ForeignIdentifierAssociationName="LoadToDriverAssociationNavigator" />
                </Parameter>
                <Parameter Name="driverList" Direction="Return">
                    <TypeDescriptor Name="DriverList" TypeName="System.Collections.Generic.IEnumerable`1[[SharePoint.DataConnector.VoyagerModel.Driver, VoyagerModel]]" IsCollection="true">
                        <TypeDescriptors>
                            <TypeDescriptor Name="Driver" TypeName="SharePoint.DataConnector.VoyagerModel.Driver, VoyagerModel">
                                <TypeDescriptors>
                                    <TypeDescriptor Name="Id" IsCollection="false" ReadOnly="true" TypeName="System.Int32" IdentifierEntityName="Driver" IdentifierEntityNamespace="SharePoint.DataConnector.VoyagerModel" IdentifierName="Id" />
                                </TypeDescriptors>
                            </TypeDescriptor>
                        </TypeDescriptors>
                    </TypeDescriptor>
                </Parameter>
            </Parameters>
            <MethodInstances>
                <Association Name="LoadToDriverAssociationNavigator" Type="AssociationNavigator" ReturnParameterName="driverList" ReturnTypeDescriptorPath="DriverList">
                    <SourceEntity Name="Load" Namespace="SharePoint.DataConnector.VoyagerModel" />
                    <DestinationEntity Name="Driver" Namespace="SharePoint.DataConnector.VoyagerModel" />
                </Association>
            </MethodInstances>
        </Method>
        <!-- end related entity methods -->
    </Methods>

    <AssociationGroups>
        <AssociationGroup Name="DriverToLoadAssociation">
            <AssociationReference AssociationName="LoadToDriverAssociationNavigator" Reverse="true" />
        </AssociationGroup>
    </AssociationGroups>
</Entity>
  • Это вводящее в заблуждение сообщение об ошибке?
  • Какие изменения я могу попробовать в модели?
  • Могут ли быть какие-либо настройки сайта, влияющие на это?

Спасибо за любую помощь!

2 ответа

Решение

На самом деле я столкнулся с той же проблемой, что и вы, и не мог найти много информации об этом. Однако статья MSDN, на которую вы ссылались, предназначена для SharePoint 2007 и модели BDC, а не для Business Connectivity Services.

Если у вас есть только 59 сущностей, скорее всего, LobSystem не полностью удалена после отвода вашего решения. Модель и сущности действительно удаляются, но сама LobSystem все еще будет существовать. Вы можете проверить это в Центре администрирования. Таким образом, при каждом новом развертывании вы снова добавляете объекты в систему и увеличиваете количество объектов, достигая ограничения 500 намного быстрее, чем ожидалось.

Попробуйте удалить LobSystem вручную (через центр администрирования), чтобы новая LobSystem также создавалась во время развертывания.

Итак, очевидно, не слишком много людей работают с моделями BDC для крупных предприятий? Я боюсь...

Я нашел мой ответ в MSDN. Если вы зайдете в MSDN, вы найдете ограничения LobSystem, подробно о которых;

  • LobSystemInstances - максимальное количество экземпляров на систему: 300
  • Entities - Максимальное количество объектов на систему: 200
  • Ассоциации - Максимальное количество ассоциаций на систему: 1000

По отдельности это не похоже на проблему. Я использую один экземпляр Lob, и у меня есть только 59 объектов. И в среднем около 8 ассоциаций на каждого. Но как рассчитываются ассоциации Макс, я понятия не имею. Считается ли каждая сторона ассоциации экземпляром? Добавляет ли каждая ссылка на ассоциацию ссылку?

Я хотел бы услышать немного более глубокое понимание архитектуры LobSystem.

Тем временем я собираюсь разделить мою модель на отдельные группы схем и изменить мои шаблоны, чтобы создать ассоциации в файле схемы модели bdc, которые полностью соответствуют различным моделям LobSystem.

Если кто-нибудь знает, почему это не сработает, пожалуйста, остановите меня сейчас!

Другие вопросы по тегам