[MOSS2010]利用BCS进行数据集成(二)

书接上回,继续解决苦苦困扰我的那个SoapServerException

今天摘要性的看了这篇博文,博主的实现跟我相比有两点不同

没有删掉Customer类

使用了twitter API

相对来讲,第一点显然是更大的区别,尝试着按照博主的方法去做,果然成功了!

 

目前的代码和bdcm文件如下

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Text;
using BdcModel.DBModel;

namespace BdcModel
{
    public class ProductService
    {
        private const string connectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
        private static readonly NorthWindDataContext dataContext = new NorthWindDataContext(connectionString);

        public static Product ReadItem(int id)
        {
            return (from p in dataContext.Products
                    where p.ProductID == id
                    select new Product
                    {
                        ProductID = p.ProductID,
                        ProductName = p.ProductName
                    }).FirstOrDefault();
        }

        public static IEnumerable<Product> ReadList()
        {
            return from p in dataContext.Products
                   select new Product
                   {
                       ProductID = p.ProductID,
                       ProductName = p.ProductName
                   };
        }

        public static void Update(Product product)
        {
            var productToUpdate = dataContext.Products.SingleOrDefault(p => p.ProductID == product.ProductID);
            productToUpdate.ProductName = product.ProductName;
            dataContext.SubmitChanges();
        }
    }
}

 

<?xml version="1.0" encoding="utf-8"?>
<Model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/windows/2007/BusinessDataCatalog" Name="BdcModel">
  <LobSystems>
    <LobSystem Name="BdcModel" Type="DotNetAssembly">
      <LobSystemInstances>
        <LobSystemInstance Name="BdcModel" />
      </LobSystemInstances>
      <Entities>
        <Entity Name="Product" Namespace="BdcModel" EstimatedInstanceCount="1000" Version="1.0.0.8">
          <Properties>
            <Property Name="Class" Type="System.String">BdcModel.ProductService, BdcModel</Property>
          </Properties>
          <Identifiers>
            <Identifier Name="ProductID" TypeName="System.Int32" />
          </Identifiers>
          <Methods>
            <!-- start finder method -->
            <Method Name="ReadList">
              <Parameters>
                <Parameter Direction="Return" Name="returnParameter">
                  <TypeDescriptor TypeName="System.Collections.Generic.IEnumerable`1[[BdcModel.Product, BdcModel]]" IsCollection="true" Name="ProductList">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="BdcModel.Product, BdcModel" Name="Product">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierName="ProductID" Name="ProductID" />
                          <TypeDescriptor TypeName="System.String" Name="ProductName" />
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Type="Finder" ReturnParameterName="returnParameter" Default="true" Name="ReadList" DefaultDisplayName="Product List" />
              </MethodInstances>
            </Method>
            <!-- end finder method -->
            <!-- start specific finder method -->
            <Method Name="ReadItem">
              <Parameters>
                <Parameter Direction="In" Name="id">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="ProductID" Name="ProductID" />
                </Parameter>
                <Parameter Direction="Return" Name="returnParameter">
                  <TypeDescriptor TypeName="BdcModel.Product, BdcModel" Name="Product">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Int32" IdentifierName="ProductID" Name="ProductID" />
                      <TypeDescriptor TypeName="System.String" Name="ProductName" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Type="SpecificFinder" ReturnParameterName="returnParameter" Default="true" Name="ReadItem" DefaultDisplayName="Read Product" />
              </MethodInstances>
            </Method>
            <Method Name="Update">
              <Parameters>
                <Parameter Name="product" Direction="In">
                  <TypeDescriptor Name="Product" TypeName="BdcModel.Product, BdcModel">
                    <TypeDescriptors>
                      <TypeDescriptor Name="ProductID" IdentifierName="ProductID" TypeName="System.Int32" UpdaterField="true" />
                      <TypeDescriptor Name="ProductName" TypeName="System.String" UpdaterField="true" /></TypeDescriptors></TypeDescriptor></Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="Update" Type="Updater" />
              </MethodInstances></Method>
            <!-- end specific finder method -->
          </Methods>
        </Entity>
      </Entities>
    </LobSystem>
  </LobSystems>
</Model>

继续说几点其中的问题

1 SoapServerException看起来是一个普遍性的异常。因为之后的调试过程中也经常出现这一问题,估计是运行时Server端的异常客户端都反映为SoapServerException,看不到异常栈真的很不方便

2 msdn上的那位博主在各个方法中using DataContext了,但是那样写在我的环境中就会SoapServerException。。。

3 现在list确实可以看了,但是一旦点了edit(可以看见代码中已经实现了Updater),就会如下画面,杯具啊~~~~~~~~~~~

 

哎。。。路漫漫其修远兮~~~~~~

P.S.原来Entity的结构决定了之后用BDC Explorer添加operation还是很方便的

posted @ 2010-06-07 18:38  jiaxingseng  阅读(398)  评论(0编辑  收藏  举报