DataServieException:Oracle,EFOracleProvider,POCO和EF 4.0

时间:2010-06-24 09:06:32

标签: oracle entity-framework poco wcf-data-services

我尝试将EF 4.0的新POCO功能与EFOracleProvider结合使用。我已经重新编译了EFOracleProvider(使用ODAC而不是System.Data.OracleClient)来定位.NET Framework 4(并将其放在4.0 GAC中)。到目前为止一切都还不错。

我在WCF数据服务中托管实体模型:

class DivaDispoDataService : DataService<DivaDispoContainer>
{
    public static void InitializeService(IDataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
    }
}

我的EDMX文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"  xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="DivaDispo.Store" Alias="Self" Provider="EFOracleProvider" ProviderManifestToken="10g">
        <EntityContainer Name="DivaDispoStoreContainer">
          <EntitySet Name="DIW_USER" EntityType="DivaDispo.Store.DIW_USER" store:Type="Tables" Schema="" />
        </EntityContainer>
        <EntityType Name="DIW_USER">
          <Key>
            <PropertyRef Name="IDX" />
          </Key>
          <Property Name="IDX" Type="number" Nullable="false" Precision="10" />
          <Property Name="USERNAME" Type="number" Precision="10" />
          <Property Name="PERSONNELNUMBER" Type="number" Precision="10" />
          <Property Name="PASSWORD" Type="varchar2" MaxLength="10" />
          <Property Name="ACTIVATED" Type="number" Precision="1" />
          <Property Name="ROLE" Type="number" Precision="1" />
        </EntityType>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"  xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="DivaDispo.Model" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
        <EntityContainer Name="DivaDispoContainer" annotation:LazyLoadingEnabled="false">
          <EntitySet Name="User" EntityType="DivaDispo.Model.User" />
        </EntityContainer>
        <EntityType Name="User">
          <Key>
            <PropertyRef Name="ID" />
          </Key>
          <Property Name="ID" Type="Decimal" Nullable="false" Precision="10" Scale="0"    />
          <Property Name="Username" Type="Decimal" Precision="10" Scale="0" />
          <Property Name="PersonnelNumber" Type="Decimal" Precision="10" Scale="0" />
          <Property Name="Password" Type="String" MaxLength="10" Unicode="false"  FixedLength="false" />
          <Property Name="Activated" Type="Boolean" />
          <Property Name="Role" Type="Boolean" />
        </EntityType>
      </Schema>
    </edmx:ConceptualModels>
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs" Space="C-S">
        <EntityContainerMapping StorageEntityContainer="DivaDispoStoreContainer" CdmEntityContainer="DivaDispoContainer">
          <EntitySetMapping Name="User">
            <EntityTypeMapping TypeName="IsTypeOf(DivaDispo.Model.User)">
              <MappingFragment StoreEntitySet="DIW_USER">
                <ScalarProperty Name="ID" ColumnName="IDX" />
                <ScalarProperty Name="Username" ColumnName="USERNAME" />
                <ScalarProperty Name="PersonnelNumber" ColumnName="PERSONNELNUMBER" />
                <ScalarProperty Name="Password" ColumnName="PASSWORD" />
                <ScalarProperty Name="Activated" ColumnName="ACTIVATED" />
                <ScalarProperty Name="Role" ColumnName="ROLE" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
</edmx:Edmx>

我的POCO课程如下:

public partial class User
{
    public virtual decimal ID { get; set; }
    public virtual Nullable<decimal> Username { get; set; }
    public virtual Nullable<decimal> PersonnelNumber { get; set; }
    public virtual string Password { get; set; }
    public virtual Nullable<bool> Activated { get; set; }
    public virtual Nullable<bool> Role { get; set; }
 }

和DataContext一样:

public partial class DivaDispoContainer : ObjectContext
{
    public const string ConnectionString = "name=DivaDispoContainer";
    public const string ContainerName = "DivaDispoContainer";

    #region Constructors

    public DivaDispoContainer()
        : base(ConnectionString, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = false;
    }

    public DivaDispoContainer(string connectionString)
        : base(connectionString, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = false;
    }

    public DivaDispoContainer(EntityConnection connection)
        : base(connection, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = false;
    }

    #endregion

    #region ObjectSet Properties

    public ObjectSet<User> User
    {
        get { return _user  ?? (_user = CreateObjectSet<User>("User")); }
    }
    private ObjectSet<User> _user;
  }

使用Visual Studio 2010中的POCO模板生成POCO类和DataContext。

当我启动我的WCF服务并想要查询用户时,我收到了 System.Data.Services.DataServiceException ,其中表示像somtihng

500: Internal Server error. The type 'System.Data.Entity.DynamicProxies.User_057822846B2B8DD7BB03058490B27D19E6C634EACF33438FE886  19C8BBB1CF74' is not a komplex type or entity type. 

当我查看dubgger时,我可以看到已从数据库中读取值(因此我认为EFOracleProvider正常工作)并且DynamicProxies.User _....来自我的User类(包含at从数据库中指出数据)。所以问题是:为什么我收到这个例外?有谁知道那里发生了什么?什么是DynamicProxies.User _....自动生成的类?在 WebUtil 类的方法 GetNonPrimitiveResourceType 中抛出异常。或许我有一些被忽视的东西?

任何帮助都非常感谢....

1 个答案:

答案 0 :(得分:1)

Craig到博文http://msdn.microsoft.com/en-us/library/ee705457.aspx的链接揭示了答案。它声明那里

The POCO proxy type cannot be directly serialized or deserialized by WCF 

这正是我的问题。如果我从生成的POCO类的属性中删除虚拟机,则运行时不会生成代理类型和异常消除。

再次感谢您的链接Craig。